diff --git a/addons/account/__init__.py b/addons/account/__init__.py index 52c65f0c3da..36cc1c85b5a 100644 --- a/addons/account/__init__.py +++ b/addons/account/__init__.py @@ -23,7 +23,7 @@ import account import installer import project import partner -import invoice +import account_invoice import account_bank_statement import account_bank import account_cash_statement @@ -32,7 +32,7 @@ import account_analytic_line import wizard import report import product -import sequence +import ir_sequence import company import res_currency diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py index e37a39b4351..9445688ec6d 100644 --- a/addons/account/__openerp__.py +++ b/addons/account/__openerp__.py @@ -103,8 +103,7 @@ module named account_voucher. 'account_end_fy.xml', 'account_invoice_view.xml', 'partner_view.xml', - 'data/account_invoice.xml', - 'data/account_data2.xml', + 'data/account_data.xml', 'account_invoice_workflow.xml', 'project/project_view.xml', 'project/project_report.xml', @@ -119,7 +118,7 @@ module named account_voucher. 'process/statement_process.xml', 'process/customer_invoice_process.xml', 'process/supplier_invoice_process.xml', - 'sequence_view.xml', + 'ir_sequence_view.xml', 'company_view.xml', 'board_account_view.xml', "wizard/account_report_profit_loss_view.xml", diff --git a/addons/account/account.py b/addons/account/account.py index 34306b703aa..68af88754f5 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -346,6 +346,52 @@ class account_account(osv.osv): res[account.id] = level return res + def _set_credit_debit(self, cr, uid, account_id, name, value, arg, context=None): + if context.get('config_invisible', True): + return True + + account = self.browse(cr, uid, account_id, context=context) + diff = value - getattr(account,name) + if not diff: + return True + + journal_obj = self.pool.get('account.journal') + jids = journal_obj.search(cr, uid, [('type','=','situation'),('centralisation','=',1),('company_id','=',account.company_id.id)], context=context) + if not jids: + raise osv.except_osv(_('Error!'),_("You need an Opening journal with centralisation checked to set the initial balance!")) + + period_obj = self.pool.get('account.period') + pids = period_obj.search(cr, uid, [('special','=',True),('company_id','=',account.company_id.id)], context=context) + if not pids: + raise osv.except_osv(_('Error!'),_("No opening/closing period defined, please create one to set the initial balance!")) + + move_obj = self.pool.get('account.move.line') + move_id = move_obj.search(cr, uid, [ + ('journal_id','=',jids[0]), + ('period_id','=',pids[0]), + ('account_id','=', account_id), + (name,'>', 0.0), + ('name','=', _('Opening Balance')) + ], context=context) + if move_id: + move = move_obj.browse(cr, uid, move_id[0], context=context) + move_obj.write(cr, uid, move_id[0], { + name: diff+getattr(move,name) + }, context=context) + else: + if diff<0.0: + raise osv.except_osv(_('Error!'),_("Unable to adapt the initial balance (negative value)!")) + nameinv = (name=='credit' and 'debit') or 'credit' + move_id = move_obj.create(cr, uid, { + 'name': _('Opening Balance'), + 'account_id': account_id, + 'journal_id': jids[0], + 'period_id': pids[0], + name: diff, + nameinv: 0.0 + }, context=context) + return True + _columns = { 'name': fields.char('Name', size=128, required=True, select=True), 'currency_id': fields.many2one('res.currency', 'Secondary Currency', help="Forces all moves for this account to have this secondary currency."), @@ -370,9 +416,9 @@ class account_account(osv.osv): 'child_consol_ids': fields.many2many('account.account', 'account_account_consol_rel', 'child_id', 'parent_id', 'Consolidated Children'), 'child_id': fields.function(_get_child_ids, type='many2many', relation="account.account", string="Child Accounts"), 'balance': fields.function(__compute, digits_compute=dp.get_precision('Account'), string='Balance', multi='balance'), - 'credit': fields.function(__compute, digits_compute=dp.get_precision('Account'), string='Credit', multi='balance'), - 'debit': fields.function(__compute, digits_compute=dp.get_precision('Account'), string='Debit', multi='balance'), - 'reconcile': fields.boolean('Reconcile', help="Check this if the user is allowed to reconcile entries in this account."), + 'credit': fields.function(__compute, fnct_inv=_set_credit_debit, digits_compute=dp.get_precision('Account'), string='Credit', multi='balance'), + 'debit': fields.function(__compute, fnct_inv=_set_credit_debit, digits_compute=dp.get_precision('Account'), string='Debit', multi='balance'), + 'reconcile': fields.boolean('Allow Reconciliation', help="Check this box if this account allows reconciliation of journal items."), 'shortcut': fields.char('Shortcut', size=12), 'tax_ids': fields.many2many('account.tax', 'account_account_tax_default_rel', 'account_id', 'tax_id', 'Default Taxes'), @@ -672,32 +718,22 @@ class account_journal(osv.osv): return super(account_journal, self).write(cr, uid, ids, vals, context=context) def create_sequence(self, cr, uid, vals, context=None): + """ Create new no_gap entry sequence for every new Joural """ - Create new entry sequence for every new Joural - """ - seq_pool = self.pool.get('ir.sequence') - seq_typ_pool = self.pool.get('ir.sequence.type') - - name = vals['name'] - code = vals['code'].lower() - - types = { - 'name': name, - 'code': code - } - seq_typ_pool.create(cr, uid, types) + # in account.journal code is actually the prefix of the sequence + # whereas ir.sequence code is a key to lookup global sequences. + prefix = vals['code'].upper() seq = { - 'name': name, - 'code': code, - 'active': True, - 'prefix': code + "/%(year)s/", + 'name': vals['name'], + 'implementation':'no_gap', + 'prefix': prefix + "/%(year)s/", 'padding': 4, 'number_increment': 1 } if 'company_id' in vals: seq['company_id'] = vals['company_id'] - return seq_pool.create(cr, uid, seq) + return self.pool.get('ir.sequence').create(cr, uid, seq) def create(self, cr, uid, vals, context=None): if not 'sequence_id' in vals or not vals['sequence_id']: @@ -1214,7 +1250,7 @@ class account_move(osv.osv): else: if journal.sequence_id: c = {'fiscalyear_id': move.period_id.fiscalyear_id.id} - new_name = obj_sequence.get_id(cr, uid, journal.sequence_id.id, context=c) + new_name = obj_sequence.next_by_id(cr, uid, journal.sequence_id.id, c) else: raise osv.except_osv(_('Error'), _('No sequence defined on the journal !')) @@ -2730,7 +2766,7 @@ class wizard_multi_charts_accounts(osv.osv_memory): _columns = { 'company_id':fields.many2one('res.company', 'Company', required=True), 'chart_template_id': fields.many2one('account.chart.template', 'Chart Template', required=True), - 'bank_accounts_id': fields.one2many('account.bank.accounts.wizard', 'bank_account_id', 'Bank Accounts', required=True), + 'bank_accounts_id': fields.one2many('account.bank.accounts.wizard', 'bank_account_id', 'Cash and Banks', required=True), 'code_digits':fields.integer('# of Digits', required=True, help="No. of Digits to use for account code"), 'seq_journal':fields.boolean('Separated Journal Sequences', help="Check this box if you want to use a different sequence for each created journal. Otherwise, all will use the same sequence."), "sale_tax": fields.many2one("account.tax.template", "Default Sale Tax"), @@ -2778,7 +2814,6 @@ class wizard_multi_charts_accounts(osv.osv_memory): def _get_default_accounts(self, cr, uid, context=None): return [ - {'acc_name': _('Bank Account'),'account_type':'bank'}, {'acc_name': _('Cash'),'account_type':'cash'} ] diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index 4cc2ed89786..98051a319fd 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -340,9 +340,9 @@ class account_bank_statement(osv.osv): else: if st.journal_id.sequence_id: c = {'fiscalyear_id': st.period_id.fiscalyear_id.id} - st_number = obj_seq.get_id(cr, uid, st.journal_id.sequence_id.id, context=c) + st_number = obj_seq.next_by_id(cr, uid, st.journal_id.sequence_id.id, context=c) else: - st_number = obj_seq.get(cr, uid, 'account.bank.statement') + st_number = obj_seq.next_by_code(cr, uid, 'account.bank.statement') for line in st.move_line_ids: if line.state <> 'valid': diff --git a/addons/account/account_bank_view.xml b/addons/account/account_bank_view.xml index d91739817ac..1a0e26e7c1f 100644 --- a/addons/account/account_bank_view.xml +++ b/addons/account/account_bank_view.xml @@ -13,7 +13,7 @@ - + @@ -23,16 +23,16 @@ - Bank Accounts + Setup your Bank Accounts res.partner.bank form tree,form - Configure your company's bank account and select those that must appear on the report footer. You can drag & drop bank in the list view to reorder bank accounts. If you use the accounting application of OpenERP, journals and accounts will be created automatically based on these data. + Configure your company's bank account and select those that must appear on the report footer. You can reorder banks in the list view. If you use the accounting application of OpenERP, journals and accounts will be created automatically based on these data. diff --git a/addons/account/account_cash_statement.py b/addons/account/account_cash_statement.py index dc78d19bab4..ebc97fe8a84 100644 --- a/addons/account/account_cash_statement.py +++ b/addons/account/account_cash_statement.py @@ -294,9 +294,9 @@ class account_cash_statement(osv.osv): if statement.name and statement.name == '/': if statement.journal_id.sequence_id: c = {'fiscalyear_id': statement.period_id.fiscalyear_id.id} - st_number = obj_seq.get_id(cr, uid, statement.journal_id.sequence_id.id, context=c) + st_number = obj_seq.next_by_id(cr, uid, statement.journal_id.sequence_id.id, context=c) else: - st_number = obj_seq.get(cr, uid, 'account.cash.statement') + st_number = obj_seq.next_by_code(cr, uid, 'account.cash.statement') vals.update({ 'name': st_number }) diff --git a/addons/account/account_installer.xml b/addons/account/account_installer.xml index 2ef7e982846..b35b37aa972 100644 --- a/addons/account/account_installer.xml +++ b/addons/account/account_installer.xml @@ -11,7 +11,7 @@ Accounting Application Configuration - Configure Your Accounting Chart + Configure Your Chart of Accounts The default Chart of Accounts is matching your country selection. If no certified Chart of Accounts exists for your specified country, a generic one can be installed and will be selected by default. @@ -26,7 +26,7 @@ - + @@ -44,7 +44,7 @@ - Accounting Chart Configuration + Install your Chart of Accounts ir.actions.act_window account.installer @@ -65,25 +65,13 @@ automatic - - Define your Bank Account - ir.actions.act_window - res.partner.bank - form - form - - - - - - - Review your Financial Accounts ir.actions.act_window account.account form tree,form + {'config_invisible': False} @@ -93,11 +81,12 @@ - Review your Financial Journal + Review your Financial Journals ir.actions.act_window account.journal form tree,form + Setup your accounting journals. For bank accounts, it's better to use the 'Setup Your Bank Accounts' tool that will automatically create the accounts and journals for you. @@ -111,6 +100,7 @@ account.payment.term form tree,form + Payment terms define the conditions to pay a customer or supplier invoice in one or several payments. Customers periodic reminders will use the payment terms for each letter. Each customer or supplier can be assigned to one of these payment terms. diff --git a/addons/account/invoice.py b/addons/account/account_invoice.py similarity index 100% rename from addons/account/invoice.py rename to addons/account/account_invoice.py diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 1322226bfb6..ce349fc4f4e 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -1221,7 +1221,7 @@ class account_move_line(osv.osv): vals['move_id'] = res[0] if not vals.get('move_id', False): if journal.sequence_id: - #name = self.pool.get('ir.sequence').get_id(cr, uid, journal.sequence_id.id) + #name = self.pool.get('ir.sequence').next_by_id(cr, uid, journal.sequence_id.id) v = { 'date': vals.get('date', time.strftime('%Y-%m-%d')), 'period_id': context['period_id'], diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index e5dbbedb9de..888c2cd7f2b 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -162,17 +162,21 @@
- - - - - - - + + + + + + + + + + + + - @@ -209,7 +213,6 @@ - @@ -438,9 +441,9 @@ - + - + @@ -2375,8 +2378,7 @@ Accounting Application Configuration - Generate Your Accounting Chart from a Chart Template + Generate Your Chart of Accounts from a Chart Template This will automatically configure your chart of accounts, bank accounts, taxes and journals according to the selected template @@ -2388,13 +2390,13 @@ - + - + - +
diff --git a/addons/account/configurable_account_chart.xml b/addons/account/configurable_account_chart.xml index 3ab6d3975a2..cc1e5b27380 100644 --- a/addons/account/configurable_account_chart.xml +++ b/addons/account/configurable_account_chart.xml @@ -21,26 +21,26 @@ none - - Income View - view - income - - - Expense View - expense - expense - - - Asset View - asset - asset - - - Liability View - liability - liability - + + Income View + view + income + + + Expense View + expense + expense + + + Asset View + asset + asset + + + Liability View + liability + liability + Income @@ -106,16 +106,16 @@ - - - 0 - Configurable Account Chart - - view - - + + + 0 + Configurable Account Chart + + view + + - + 1 @@ -125,120 +125,120 @@ - - 10 - Fixed Assets - - view - - + + 10 + Fixed Assets + + view + + - - 100 - Fixed Asset Account - - other - - + + 100 + Fixed Asset Account + + other + + - - 11 - Net Current Assets - - view - - + + 11 + Net Current Assets + + view + + - - 110 - Current Assets - - view - - + + 110 + Current Assets + + view + + - - 1101 - Purchased Stocks - - other - - + + 1101 + Purchased Stocks + + other + + - - 1102 - Debtors - - receivable - - - + + 1102 + Debtors + + receivable + + + - - 1103 - Tax Paid - - other - - + + 1103 + Tax Paid + + other + + - - 1104 - Bank Current Account - - view - - + + 1104 + Bank Current Account + + view + + - - 1106 - Opening Income Account - - other - - + + 1106 + Opening Income Account + + other + + - - 111 - Current Liabilities - - view - - + + 111 + Current Liabilities + + view + + - - 1111 - Creditors - - payable - - - + + 1111 + Creditors + + payable + + + - - 1112 - Tax Received - - other - - + + 1112 + Tax Received + + other + + - - 1113 - Reserve and Profit/Loss Account - - other - - - + + 1113 + Reserve and Profit/Loss Account + + other + + + - - 1114 - Opening Expense Account - - other - - + + 1114 + Opening Expense Account + + other + + @@ -250,53 +250,53 @@ - - 20 - Revenue - - view - - + + 20 + Revenue + + view + + - - 200 - Product Sales - - other - - + + 200 + Product Sales + + other + + - - 21 - Cost of Sales - - view - - + + 21 + Cost of Sales + + view + + - - 210 - Cost of Goods Sold - - other - - + + 210 + Cost of Goods Sold + + other + + - - 22 - Overheads - - view - - + + 22 + Overheads + + view + + - - 220 - Expenses - - other - - + + 220 + Expenses + + other + + 221 @@ -315,126 +315,126 @@ Plan Fees - - Tax Balance to Pay - - + + Tax Balance to Pay + + - - - Tax Received - - - + + + Tax Received + + + - - Tax Received Rate S (15%) - - + + Tax Received Rate S (15%) + + - - Tax Received Rate R (5%) - - + + Tax Received Rate R (5%) + + - - Tax Received Rate X (Exempt) - - + + Tax Received Rate X (Exempt) + + - - Tax Received Rate O (Out of scope) - - + + Tax Received Rate O (Out of scope) + + - + - - Tax Paid - - + + Tax Paid + + - - Tax Paid Rate S (15%) - - + + Tax Paid Rate S (15%) + + - - Tax Paid Rate R (5%) - - + + Tax Paid Rate R (5%) + + - - Tax Paid Rate X (Exempt) - - + + Tax Paid Rate X (Exempt) + + - - Tax Paid Rate O (Out of scope) - - + + Tax Paid Rate O (Out of scope) + + - + - + - - Tax Bases - - + + Tax Bases + + - - Taxable Purchases Base - - + + Taxable Purchases Base + + - - Taxable Purchases Rated S (15%) - - + + Taxable Purchases Rated S (15%) + + - - Taxable Purchases Rated R (5%) - - + + Taxable Purchases Rated R (5%) + + - - Taxable Purchases Type X (Exempt) - - + + Taxable Purchases Type X (Exempt) + + - - Taxable Purchases Type O (Out of scope) - - + + Taxable Purchases Type O (Out of scope) + + - + - - Base of Taxable Sales - - + + Base of Taxable Sales + + - - Taxable Sales Rated S (15%) - - + + Taxable Sales Rated S (15%) + + - - Taxable Sales Rated R (5%) - - + + Taxable Sales Rated R (5%) + + - - Taxable Sales Type X (Exempt) - - + + Taxable Sales Type X (Exempt) + + - - Taxable Sales Type O (Out of scope) - - + + Taxable Sales Type O (Out of scope) + + Configurable Account Chart Template @@ -450,7 +450,7 @@ - + @@ -569,9 +569,9 @@ - - - + + + @@ -584,40 +584,40 @@ - - - + + + - + - + - + - - - + + + - - - + + + - - Generate Chart of Accounts from a Chart Template - - - automatic - + + Generate Chart of Accounts from a Chart Template + + + automatic + diff --git a/addons/account/data/account_data2.xml b/addons/account/data/account_data.xml similarity index 94% rename from addons/account/data/account_data2.xml rename to addons/account/data/account_data.xml index 48630c9899d..e111c453325 100644 --- a/addons/account/data/account_data2.xml +++ b/addons/account/data/account_data.xml @@ -469,66 +469,48 @@ Account Journal Sequences --> - - Account Journal - account.journal - - - Account Journal - account.journal - - - Sale Journal - account.journal + Account Default Sales Journal SAJ/%(year)s/ - Sales Credit Note Journal - account.journal + Account Default Sales Credit Note Journal SCNJ/%(year)s/ - Purchase Journal - account.journal + Account Default Expenses Journal EXJ/%(year)s/ - Expenses Credit Notes Journal - account.journal + Account Default Expenses Credit Notes Journal ECNJ/%(year)s/ - Bank Journal - account.journal + Account Default Bank Journal BNK/%(year)s/ - Checks Journal - account.journal + Account Default Checks Journal CHK/%(year)s/ - Cash Journal - account.journal + Account Default Cash Journal CSH/%(year)s/ - Opening Entries Journal - account.journal + Account Default Opening Entries Journal OPEJ/%(year)s/ - Miscellaneous Journal - account.journal + Account Default Miscellaneous Journal MISJ/%(year)s/ @@ -538,7 +520,7 @@ --> - Account reconcile sequence + Account Reconcile account.reconcile @@ -550,7 +532,7 @@ - Bank Statement + Account Bank Statement account.bank.statement @@ -562,7 +544,7 @@ - Cash Statement + Account Cash Statement account.cash.statement @@ -572,5 +554,30 @@ + + + + Analytic account + account.analytic.account + + + Analytic account sequence + account.analytic.account + + + + + + + Invoice + account.invoice + + + + diff --git a/addons/account/data/account_invoice.xml b/addons/account/data/account_invoice.xml deleted file mode 100644 index 54f5ed6de91..00000000000 --- a/addons/account/data/account_invoice.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Invoice - account.invoice - - - - - Account Invoice Out - account.invoice.out_invoice - - - Account Invoice In - account.invoice.in_invoice - - - Account Refund Out - account.invoice.out_refund - - - Account Refund In - account.invoice.in_refund - - - - - Account Invoice Out - account.invoice.out_invoice - - %(year)s/ - - - Account Invoice In - account.invoice.in_invoice - - %(year)s/ - - - Account Refund Out - account.invoice.out_refund - - %(year)s/ - - - Account Refund In - account.invoice.in_refund - - %(year)s/ - - - - - Analytic account - account.analytic.account - - - - - Analytic account sequence - account.analytic.account - - - - - diff --git a/addons/account/i18n/ar.po b/addons/account/i18n/ar.po index 170ac722c7a..74fcc0ee06d 100644 --- a/addons/account/i18n/ar.po +++ b/addons/account/i18n/ar.po @@ -7,19 +7,19 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-09-22 02:55+0000\n" +"PO-Revision-Date: 2011-09-30 23:12+0000\n" "Last-Translator: Majed Majbour \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: 2011-09-23 04:38+0000\n" -"X-Generator: Launchpad (build 14012)\n" +"X-Launchpad-Export-Date: 2011-10-02 04:51+0000\n" +"X-Generator: Launchpad (build 14071)\n" #. module: account #: model:process.transition,name:account.process_transition_supplierreconcilepaid0 msgid "System payment" -msgstr "الدفع عن طريق النظام" +msgstr "نظام الدفع" #. module: account #: view:account.journal:0 @@ -124,6 +124,8 @@ msgid "" "If you unreconciliate transactions, you must also verify all the actions " "that are linked to those transactions because they will not be disabled" msgstr "" +"إذا كنت توافق على المعاملات ، يجب عليك أيضا التحقق من كافة الإجراءات التي " +"ترتبط بتلك المعاملات لأنه لن يكونوا غير مفعّلين" #. module: account #: report:account.tax.code.entries:0 diff --git a/addons/account/i18n/et.po b/addons/account/i18n/et.po index 6c6a6385ec9..ff6ae9bfc3a 100644 --- a/addons/account/i18n/et.po +++ b/addons/account/i18n/et.po @@ -7,24 +7,24 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2010-12-12 00:12+0000\n" -"Last-Translator: qdp (OpenERP) \n" +"PO-Revision-Date: 2011-09-30 07:02+0000\n" +"Last-Translator: Raiko Pajur \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: 2011-09-17 04:56+0000\n" -"X-Generator: Launchpad (build 13955)\n" +"X-Launchpad-Export-Date: 2011-10-01 05:08+0000\n" +"X-Generator: Launchpad (build 14071)\n" #. module: account #: model:process.transition,name:account.process_transition_supplierreconcilepaid0 msgid "System payment" -msgstr "" +msgstr "Süsteemi maksed" #. module: account #: view:account.journal:0 msgid "Other Configuration" -msgstr "" +msgstr "Muud konfiguratsioonid" #. module: account #: code:addons/account/wizard/account_open_closed_fiscalyear.py:40 @@ -39,6 +39,8 @@ msgid "" "You cannot remove/deactivate an account which is set as a property to any " "Partner." msgstr "" +"Sa ei saa kustutada / desaktiveerida kontot, mis on määratud mis tahes " +"\"Partner\" varaks." #. module: account #: view:account.move.reconcile:0 @@ -48,7 +50,7 @@ msgstr "" #. module: account #: field:account.installer.modules,account_voucher:0 msgid "Voucher Management" -msgstr "" +msgstr "Voucheri juhtimine" #. module: account #: view:account.account:0 @@ -133,13 +135,13 @@ msgstr "Raamatupidamise kirjed-" #: code:addons/account/account.py:1291 #, python-format msgid "You can not delete posted movement: \"%s\"!" -msgstr "" +msgstr "Sa ei saa kustutada postitatud liikumist: \"%s\"!" #. module: account #: report:account.invoice:0 #: field:account.invoice.line,origin:0 msgid "Origin" -msgstr "Päritolu" +msgstr "Allikas" #. module: account #: view:account.account:0 @@ -164,7 +166,7 @@ msgstr "Viide" #. module: account #: view:account.open.closed.fiscalyear:0 msgid "Choose Fiscal Year " -msgstr "" +msgstr "Vali eelarveaasta " #. module: account #: help:account.payment.term,active:0 @@ -172,12 +174,14 @@ msgid "" "If the active field is set to False, it will allow you to hide the payment " "term without removing it." msgstr "" +"Kui aktiivne ala on väärne ( False ), siis see võimaldab teil peita/varjata " +"maksetähtaeg seda kustutamata." #. module: account #: code:addons/account/invoice.py:1421 #, python-format msgid "Warning!" -msgstr "" +msgstr "Hoiatus!" #. module: account #: field:account.fiscal.position.account,account_src_id:0 @@ -204,7 +208,7 @@ msgstr "Negatiivne" #: code:addons/account/wizard/account_move_journal.py:95 #, python-format msgid "Journal: %s" -msgstr "" +msgstr "Päevik: %s" #. module: account #: help:account.analytic.journal,type:0 @@ -231,7 +235,7 @@ msgstr "konto.maks" msgid "" "No period defined for this date: %s !\n" "Please create a fiscal year." -msgstr "" +msgstr "Periood ei ole defineeritud sellele kuupäevale: %s" #. module: account #: model:ir.model,name:account.model_account_move_line_reconcile_select @@ -259,7 +263,7 @@ msgstr "" #: code:addons/account/invoice.py:1210 #, python-format msgid "Invoice '%s' is paid partially: %s%s of %s%s (%s%s remaining)" -msgstr "" +msgstr "Arve '%s' on makstud osaliselt: %s%s on tasutud %s%s (%s%s maksmata)" #. module: account #: model:process.transition,note:account.process_transition_supplierentriesreconcile0 @@ -280,7 +284,7 @@ msgstr "Teie ei saa lisada/muuta suletud päeviku kirjeid." #. module: account #: view:account.bank.statement:0 msgid "Calculated Balance" -msgstr "" +msgstr "Välja arvutatud tasakaal (Calculated Balance)" #. module: account #: model:ir.actions.act_window,name:account.action_account_use_model_create_entry @@ -352,7 +356,7 @@ msgstr "Ostu omadused" #: view:account.installer:0 #: view:account.installer.modules:0 msgid "Configure" -msgstr "" +msgstr "Seadista" #. module: account #: selection:account.entries.report,month:0 @@ -361,7 +365,7 @@ msgstr "" #: selection:report.account.sales,month:0 #: selection:report.account_type.sales,month:0 msgid "June" -msgstr "" +msgstr "Juuni" #. module: account #: model:ir.actions.act_window,help:account.action_account_moves_bank @@ -395,12 +399,12 @@ msgstr "" #. module: account #: selection:account.journal,type:0 msgid "Opening/Closing Situation" -msgstr "" +msgstr "Avamise/Sulgemise situatsioon" #. module: account #: help:account.journal,currency:0 msgid "The currency used to enter statement" -msgstr "" +msgstr "Valuuta väite sisestamiseks" #. module: account #: field:account.open.closed.fiscalyear,fyear_id:0 @@ -498,17 +502,17 @@ msgstr "Päevik" #. module: account #: model:ir.model,name:account.model_account_invoice_confirm msgid "Confirm the selected invoices" -msgstr "" +msgstr "Kinnita valitud arved" #. module: account #: field:account.addtmpl.wizard,cparent_id:0 msgid "Parent target" -msgstr "" +msgstr "Lapsevanema sihtmärk" #. module: account #: field:account.bank.statement,account_id:0 msgid "Account used in this journal" -msgstr "" +msgstr "Konto kasutatud selles arveraamatus" #. module: account #: help:account.aged.trial.balance,chart_account_id:0 @@ -527,7 +531,7 @@ msgstr "" #: help:account.report.general.ledger,chart_account_id:0 #: help:account.vat.declaration,chart_account_id:0 msgid "Select Charts of Accounts" -msgstr "" +msgstr "Vali Kontode graafikud" #. module: account #: view:product.product:0 @@ -537,7 +541,7 @@ msgstr "Ostumaksud" #. module: account #: model:ir.model,name:account.model_account_invoice_refund msgid "Invoice Refund" -msgstr "" +msgstr "Arveraamatu tagasimakse" #. module: account #: report:account.overdue:0 @@ -560,7 +564,7 @@ msgstr "" #: field:account.fiscal.position,tax_ids:0 #: field:account.fiscal.position.template,tax_ids:0 msgid "Tax Mapping" -msgstr "" +msgstr "Maksude kaardistamine" #. module: account #: model:ir.actions.act_window,name:account.action_account_fiscalyear_close_state @@ -571,7 +575,7 @@ msgstr "Sule majandusaasta" #. module: account #: model:process.transition,note:account.process_transition_confirmstatementfromdraft0 msgid "The accountant confirms the statement." -msgstr "" +msgstr "Raamatupidaja kinnitab selle avalduse" #. module: account #: selection:account.balance.report,display_account:0 @@ -587,12 +591,12 @@ msgstr "Kõik" #. module: account #: field:account.invoice.report,address_invoice_id:0 msgid "Invoice Address Name" -msgstr "" +msgstr "Arveraamatu Aadressi Nimi" #. module: account #: selection:account.installer,period:0 msgid "3 Monthly" -msgstr "" +msgstr "Iga 3 kuu tagant" #. module: account #: view:account.unreconcile.reconcile:0 @@ -604,7 +608,7 @@ msgstr "" #. module: account #: view:analytic.entries.report:0 msgid " 30 Days " -msgstr "" +msgstr " 30 päeva " #. module: account #: field:ir.sequence,fiscal_ids:0 @@ -624,7 +628,7 @@ msgstr "" #. module: account #: sql_constraint:account.sequence.fiscalyear:0 msgid "Main Sequence must be different from current !" -msgstr "" +msgstr "Pea" #. module: account #: field:account.invoice.tax,tax_amount:0 @@ -652,12 +656,12 @@ msgstr "Sulge periood" #. module: account #: model:ir.model,name:account.model_account_common_partner_report msgid "Account Common Partner Report" -msgstr "" +msgstr "Konto tava \"Partner\" aruanne" #. module: account #: field:account.fiscalyear.close,period_id:0 msgid "Opening Entries Period" -msgstr "" +msgstr "Avatud sissekanete periood" #. module: account #: model:ir.model,name:account.model_account_journal_period @@ -791,7 +795,7 @@ msgstr "J.C./liiguta nime" #: selection:report.account.sales,month:0 #: selection:report.account_type.sales,month:0 msgid "September" -msgstr "" +msgstr "September" #. module: account #: selection:account.subscription,period_type:0 @@ -802,7 +806,7 @@ msgstr "päevad" #: help:account.account.template,nocreate:0 msgid "" "If checked, the new chart of accounts will not contain this by default." -msgstr "" +msgstr "Kui märgitud, siis uus kontode graafik ei sisalda seda puudujääki." #. module: account #: code:addons/account/wizard/account_invoice_refund.py:102 @@ -825,7 +829,7 @@ msgstr "Arvutus" #. module: account #: view:account.move.line:0 msgid "Next Partner to reconcile" -msgstr "" +msgstr "Kooskõlastama järgmise \"Partner\"-iga" #. module: account #: code:addons/account/account_move_line.py:1191 @@ -834,12 +838,14 @@ msgid "" "You can not do this modification on a confirmed entry ! Please note that you " "can just change some non important fields !" msgstr "" +"Teie ei saa teha see muudatus kinnitatud kirjel ! Teie saate muuta ainult " +"mõned vähetähtsad väljad !" #. module: account #: view:account.invoice.report:0 #: field:account.invoice.report,delay_to_pay:0 msgid "Avg. Delay To Pay" -msgstr "" +msgstr "Keskmine viivitus maksete tegemisel" #. module: account #: model:ir.actions.act_window,name:account.action_account_tax_chart @@ -862,7 +868,7 @@ msgstr "Tähtaeg" #: view:account.invoice.report:0 #: field:account.invoice.report,price_total_tax:0 msgid "Total With Tax" -msgstr "" +msgstr "Kokku koos maksudega" #. module: account #: view:account.invoice:0 @@ -870,7 +876,7 @@ msgstr "" #: view:validate.account.move:0 #: view:validate.account.move.lines:0 msgid "Approve" -msgstr "" +msgstr "Nõustu" #. module: account #: view:account.invoice:0 @@ -925,7 +931,7 @@ msgstr "" #. module: account #: view:account.analytic.line:0 msgid "Purchases" -msgstr "" +msgstr "Ostud" #. module: account #: field:account.model,lines_id:0 @@ -972,7 +978,7 @@ msgstr "Partneri bilanss" #. module: account #: field:account.bank.accounts.wizard,acc_name:0 msgid "Account Name." -msgstr "" +msgstr "Konto nimi." #. module: account #: field:account.chart.template,property_reserve_and_surplus_account:0 @@ -983,7 +989,7 @@ msgstr "" #. module: account #: field:report.account.receivable,name:0 msgid "Week of Year" -msgstr "" +msgstr "Nädal" #. module: account #: field:account.bs.report,display_type:0 @@ -995,12 +1001,12 @@ msgstr "Rõhtpaigutus" #. module: account #: view:board.board:0 msgid "Customer Invoices to Approve" -msgstr "" +msgstr "Kliendi arved kinnitamiseks" #. module: account #: help:account.fiscalyear.close,fy_id:0 msgid "Select a Fiscal year to close" -msgstr "" +msgstr "Vali eelarve aasta mida sulgeda" #. module: account #: help:account.account,user_type:0 @@ -1018,13 +1024,13 @@ msgstr "" #. module: account #: report:account.partner.balance:0 msgid "In dispute" -msgstr "" +msgstr "Vaidlustatav" #. module: account #: model:ir.actions.act_window,name:account.action_view_bank_statement_tree #: model:ir.ui.menu,name:account.journal_cash_move_lines msgid "Cash Registers" -msgstr "" +msgstr "Raha register" #. module: account #: selection:account.account.type,report_type:0 @@ -1042,7 +1048,7 @@ msgstr "-" #. module: account #: view:account.analytic.account:0 msgid "Manager" -msgstr "" +msgstr "Juhataja" #. module: account #: view:account.subscription.generate:0 @@ -1052,7 +1058,7 @@ msgstr "" #. module: account #: selection:account.bank.accounts.wizard,account_type:0 msgid "Bank" -msgstr "" +msgstr "Pank" #. module: account #: field:account.period,date_start:0 @@ -1062,13 +1068,13 @@ msgstr "Perioodi algus" #. module: account #: model:process.transition,name:account.process_transition_confirmstatementfromdraft0 msgid "Confirm statement" -msgstr "" +msgstr "Kinnita avaldus" #. module: account #: field:account.fiscal.position.tax,tax_dest_id:0 #: field:account.fiscal.position.tax.template,tax_dest_id:0 msgid "Replacement Tax" -msgstr "" +msgstr "Vahetus maks" #. module: account #: selection:account.move.line,centralisation:0 @@ -1087,12 +1093,12 @@ msgstr "" #. module: account #: view:account.invoice.cancel:0 msgid "Cancel Invoices" -msgstr "" +msgstr "Peata arved" #. module: account #: view:account.unreconcile.reconcile:0 msgid "Unreconciliation transactions" -msgstr "" +msgstr "Mittesobivad tehingud" #. module: account #: field:account.invoice.tax,tax_code_id:0 @@ -1110,7 +1116,7 @@ msgstr "" #. module: account #: help:account.move.line,move_id:0 msgid "The move of this entry line." -msgstr "" +msgstr "Selle rea liigutus." #. module: account #: field:account.move.line.reconcile,trans_nbr:0 @@ -1174,7 +1180,7 @@ msgstr "Konto" #. module: account #: field:account.tax,include_base_amount:0 msgid "Included in base amount" -msgstr "" +msgstr "Lisa baas osa" #. module: account #: view:account.entries.report:0 @@ -1186,7 +1192,7 @@ msgstr "" #. module: account #: field:account.account,level:0 msgid "Level" -msgstr "" +msgstr "Tase" #. module: account #: report:account.invoice:0 @@ -1207,7 +1213,7 @@ msgstr "Maksud" #: code:addons/account/wizard/account_report_common.py:120 #, python-format msgid "Select a starting and an ending period" -msgstr "" +msgstr "Vali algus ja lõpp periood" #. module: account #: model:ir.model,name:account.model_account_account_template @@ -1217,12 +1223,12 @@ msgstr "Mallid kontodele" #. module: account #: view:account.tax.code.template:0 msgid "Search tax template" -msgstr "" +msgstr "Otsi maksu templati" #. module: account #: report:account.invoice:0 msgid "Your Reference" -msgstr "" +msgstr "Teie viide" #. module: account #: view:account.move.reconcile:0 @@ -1246,7 +1252,7 @@ msgstr "" #. module: account #: view:account.invoice:0 msgid "Reset to Draft" -msgstr "" +msgstr "Lähtesta mustandiks" #. module: account #: view:wizard.multi.charts.accounts:0 @@ -1268,7 +1274,7 @@ msgstr "" #: model:ir.actions.act_window,name:account.action_partner_all #: model:ir.ui.menu,name:account.next_id_22 msgid "Partners" -msgstr "" +msgstr "Partnerid" #. module: account #: view:account.bank.statement:0 @@ -1323,7 +1329,7 @@ msgstr "Bilanss pole 0" #. module: account #: view:account.tax:0 msgid "Search Taxes" -msgstr "" +msgstr "Otsi maksu" #. module: account #: model:ir.model,name:account.model_account_analytic_cost_ledger @@ -1338,7 +1344,7 @@ msgstr "Loo sissekanded" #. module: account #: field:account.entries.report,nbr:0 msgid "# of Items" -msgstr "" +msgstr "# detaile" #. module: account #: field:account.automatic.reconcile,max_amount:0 @@ -1353,7 +1359,7 @@ msgstr "Arvuta maksud" #. module: account #: field:wizard.multi.charts.accounts,code_digits:0 msgid "# of Digits" -msgstr "" +msgstr "# numbrit" #. module: account #: field:account.journal,entry_posted:0 @@ -1364,7 +1370,7 @@ msgstr "" #: view:account.invoice.report:0 #: field:account.invoice.report,price_total:0 msgid "Total Without Tax" -msgstr "" +msgstr "Kokku ilma maksudeta" #. module: account #: model:ir.actions.act_window,help:account.action_move_journal_line @@ -1378,7 +1384,7 @@ msgstr "" #. module: account #: view:account.entries.report:0 msgid "# of Entries " -msgstr "" +msgstr "# sisestusi " #. module: account #: model:ir.model,name:account.model_temp_range @@ -1435,7 +1441,7 @@ msgstr "Mall finantspositsioonile" #. module: account #: model:account.tax.code,name:account.account_tax_code_0 msgid "Tax Code Test" -msgstr "" +msgstr "Maksu koodi test" #. module: account #: field:account.automatic.reconcile,reconciled:0 @@ -1445,22 +1451,22 @@ msgstr "" #. module: account #: field:account.journal.view,columns_id:0 msgid "Columns" -msgstr "" +msgstr "Veerud" #. module: account #: report:account.overdue:0 msgid "." -msgstr "" +msgstr "." #. module: account #: view:account.analytic.cost.ledger.journal.report:0 msgid "and Journals" -msgstr "" +msgstr "ja arveraamatud" #. module: account #: field:account.journal,groups_id:0 msgid "Groups" -msgstr "" +msgstr "Grupid" #. module: account #: field:account.invoice,amount_untaxed:0 @@ -1471,18 +1477,20 @@ msgstr "Maksuvaba" #. module: account #: view:account.partner.reconcile.process:0 msgid "Go to next partner" -msgstr "" +msgstr "Mine järgmise \"Partner\"-ile" #. module: account #: view:account.bank.statement:0 msgid "Search Bank Statements" -msgstr "" +msgstr "Otsi panga avaldust" #. module: account #: sql_constraint:account.model.line:0 msgid "" "Wrong credit or debit value in model (Credit + Debit Must Be greater \"0\")!" msgstr "" +"Vale krediidi või deebeti arv mudelis ( Krediit + Deebet Peab olema suurem " +"kui \"0\" ) !" #. module: account #: view:account.chart.template:0 @@ -1516,14 +1524,14 @@ msgstr "" #. module: account #: report:account.analytic.account.cost_ledger:0 msgid "Date/Code" -msgstr "" +msgstr "Kuupäev/Kood" #. module: account #: field:account.analytic.line,general_account_id:0 #: view:analytic.entries.report:0 #: field:analytic.entries.report,general_account_id:0 msgid "General Account" -msgstr "" +msgstr "Üldine konto" #. module: account #: field:res.partner,debit_limit:0 @@ -1554,13 +1562,13 @@ msgstr "" #. module: account #: field:wizard.multi.charts.accounts,seq_journal:0 msgid "Separated Journal Sequences" -msgstr "" +msgstr "Eraldatud päeviku järjekorrad" #. module: account #: field:account.bank.statement,user_id:0 #: view:account.invoice:0 msgid "Responsible" -msgstr "" +msgstr "Vastutav" #. module: account #: report:account.overdue:0 @@ -1570,7 +1578,7 @@ msgstr "Vahesumma:" #. module: account #: model:ir.actions.act_window,name:account.action_report_account_type_sales_tree_all msgid "Sales by Account Type" -msgstr "" +msgstr "Müügid konto järgi" #. module: account #: view:account.invoice.refund:0 @@ -1582,7 +1590,7 @@ msgstr "" #. module: account #: model:ir.ui.menu,name:account.periodical_processing_invoicing msgid "Invoicing" -msgstr "" +msgstr "Arveldamine" #. module: account #: field:account.chart.template,tax_code_root_id:0 @@ -1598,17 +1606,17 @@ msgstr "Kaasa algsed" #. module: account #: field:account.tax.code,sum:0 msgid "Year Sum" -msgstr "" +msgstr "Aasta kokkuvõtte" #. module: account #: model:ir.actions.report.xml,name:account.report_account_voucher_new msgid "Print Voucher" -msgstr "" +msgstr "Prindi voucher" #. module: account #: view:account.change.currency:0 msgid "This wizard will change the currency of the invoice" -msgstr "" +msgstr "See wizard muudab valuuta arvelduses" #. module: account #: model:ir.actions.act_window,help:account.action_account_chart @@ -1632,7 +1640,7 @@ msgstr "" #. module: account #: field:account.cashbox.line,pieces:0 msgid "Values" -msgstr "" +msgstr "Väärtused" #. module: account #: help:account.journal.period,active:0 @@ -1675,7 +1683,7 @@ msgstr "" #. module: account #: report:account.move.voucher:0 msgid "Ref. :" -msgstr "" +msgstr "Viide:" #. module: account #: view:account.analytic.chart:0 @@ -1685,7 +1693,7 @@ msgstr "Analüütilised kontoplaanid" #. module: account #: view:account.analytic.line:0 msgid "My Entries" -msgstr "" +msgstr "Minu sisestused" #. module: account #: report:account.overdue:0 @@ -1696,7 +1704,7 @@ msgstr "Kliendi viide:" #: code:addons/account/account_cash_statement.py:328 #, python-format msgid "User %s does not have rights to access %s journal !" -msgstr "" +msgstr "Kasutajal %s ei ole õigusi et siseneda %s arveraamatusse !" #. module: account #: help:account.period,special:0 @@ -1717,12 +1725,12 @@ msgstr "" #: code:addons/account/account.py:499 #, python-format msgid "You cannot deactivate an account that contains account moves." -msgstr "" +msgstr "Sa ei saa deaktiveerida kontot mis sisaldab konto liikumisi." #. module: account #: field:account.move.line.reconcile,credit:0 msgid "Credit amount" -msgstr "" +msgstr "Kreedidi kogus" #. module: account #: constraint:account.move.line:0 @@ -1745,7 +1753,7 @@ msgstr "" #. module: account #: sql_constraint:account.move.line:0 msgid "Wrong credit or debit value in accounting entry !" -msgstr "" +msgstr "Vale kreedit või deebeti raamatupidamise sisend !" #. module: account #: view:account.invoice.report:0 @@ -1757,7 +1765,7 @@ msgstr "" #. module: account #: model:ir.model,name:account.model_account_period_close msgid "period close" -msgstr "" +msgstr "Periood suletud" #. module: account #: view:account.installer:0 @@ -1767,18 +1775,18 @@ msgstr "" #. module: account #: model:ir.actions.act_window,name:account.action_project_account_analytic_line_form msgid "Entries By Line" -msgstr "" +msgstr "SIsestused ridade kaupa" #. module: account #: report:account.tax.code.entries:0 msgid "A/c Code" -msgstr "" +msgstr "A/c kood" #. module: account #: field:account.invoice,move_id:0 #: field:account.invoice,move_name:0 msgid "Journal Entry" -msgstr "" +msgstr "Päevaraamatu kanne" #. module: account #: view:account.tax:0 @@ -1788,7 +1796,7 @@ msgstr "" #. module: account #: field:account.cashbox.line,subtotal:0 msgid "Sub Total" -msgstr "" +msgstr "Vahesumma" #. module: account #: view:account.account:0 @@ -1798,7 +1806,7 @@ msgstr "" #. module: account #: constraint:res.company:0 msgid "Error! You can not create recursive companies." -msgstr "" +msgstr "Viga! Sa ei saa luua rekursiivseid ettevõtteid." #. module: account #: view:account.analytic.account:0 @@ -1821,12 +1829,12 @@ msgstr "Kehtiv" #: model:ir.actions.act_window,name:account.action_account_print_journal #: model:ir.model,name:account.model_account_print_journal msgid "Account Print Journal" -msgstr "" +msgstr "Prindi konto arveraamat" #. module: account #: model:ir.model,name:account.model_product_category msgid "Product Category" -msgstr "" +msgstr "Toote kategooria" #. module: account #: selection:account.account.type,report_type:0 @@ -1836,7 +1844,7 @@ msgstr "/" #. module: account #: field:account.bs.report,reserve_account_id:0 msgid "Reserve & Profit/Loss Account" -msgstr "" +msgstr "Reservi & kasumi/kahjumi konto" #. module: account #: help:account.bank.statement,balance_end:0 @@ -1887,12 +1895,12 @@ msgstr "" #: field:account.installer.modules,config_logo:0 #: field:wizard.multi.charts.accounts,config_logo:0 msgid "Image" -msgstr "" +msgstr "Pilt" #. module: account #: report:account.move.voucher:0 msgid "Canceled" -msgstr "" +msgstr "Tühistatud" #. module: account #: view:account.invoice:0 diff --git a/addons/account/sequence.py b/addons/account/ir_sequence.py similarity index 70% rename from addons/account/sequence.py rename to addons/account/ir_sequence.py index 1683e5feb06..5c9039e43c3 100644 --- a/addons/account/sequence.py +++ b/addons/account/ir_sequence.py @@ -46,23 +46,14 @@ class ir_sequence(osv.osv): 'fiscal_ids': fields.one2many('account.sequence.fiscalyear', 'sequence_main_id', 'Sequences') } - def get_id(self, cr, uid, sequence_id, test='id', context=None): - if context is None: - context = {} - cr.execute('select id from ir_sequence where ' - + test + '=%s and active=%s', (sequence_id, True,)) - res = cr.dictfetchone() - if res: - for line in self.browse(cr, uid, res['id'], - context=context).fiscal_ids: - if line.fiscalyear_id.id == context.get('fiscalyear_id', False): - return super(ir_sequence, self).get_id(cr, uid, - line.sequence_id.id, - test="id", - context=context) - return super(ir_sequence, self).get_id(cr, uid, sequence_id, test, - context=context) + + def _next(self, cr, uid, seq_ids, context=None): + for seq in self.browse(cr, uid, seq_ids, context): + for line in seq.fiscal_ids: + if line.fiscalyear_id.id == context.get('fiscalyear_id'): + return super(ir_sequence, self)._next(cr, uid, [line.sequence_id.id], context) + return super(ir_sequence, self)._next(cr, uid, seq_ids, context) ir_sequence() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/sequence_view.xml b/addons/account/ir_sequence_view.xml similarity index 100% rename from addons/account/sequence_view.xml rename to addons/account/ir_sequence_view.xml diff --git a/addons/account/test/account_fiscalyear_close.yml b/addons/account/test/account_fiscalyear_close.yml index 109b098d6a7..1e24d2ca0e7 100644 --- a/addons/account/test/account_fiscalyear_close.yml +++ b/addons/account/test/account_fiscalyear_close.yml @@ -26,7 +26,6 @@ code: NEW type: situation analytic_journal_id: sit - sequence_id: sequence_journal default_debit_account_id: cash default_credit_account_id: cash company_id: base.main_company diff --git a/addons/account_analytic_plans/account_analytic_plans_installer_view.xml b/addons/account_analytic_plans/account_analytic_plans_installer_view.xml index c9d21147458..c6879774078 100644 --- a/addons/account_analytic_plans/account_analytic_plans_installer_view.xml +++ b/addons/account_analytic_plans/account_analytic_plans_installer_view.xml @@ -7,14 +7,15 @@ account.analytic.plan form tree,form - + + To setup a multiple analytic plans environment, you must define the root analytic accounts for each plan set. Then, you must attach a plan set to your account journals. + + + + + + 15 - - - - - 15 - diff --git a/addons/account_asset/i18n/pt_BR.po b/addons/account_asset/i18n/pt_BR.po new file mode 100644 index 00000000000..fbfd6d7feb4 --- /dev/null +++ b/addons/account_asset/i18n/pt_BR.po @@ -0,0 +1,529 @@ +# Brazilian Portuguese translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-11-24 12:54+0000\n" +"PO-Revision-Date: 2011-09-30 14:07+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Brazilian Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-10-01 05:08+0000\n" +"X-Generator: Launchpad (build 14071)\n" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list_normal +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list_normal +msgid "Open Assets" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,method_end:0 +#: field:account.asset.property.history,method_end:0 +msgid "Ending date" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Depreciation board" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +#: field:account.asset.asset,name:0 +#: field:account.asset.board,asset_id:0 +#: field:account.asset.property,asset_id:0 +#: field:account.invoice.line,asset_id:0 +#: field:account.move.line,asset_id:0 +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_form +#: model:ir.model,name:account_asset.model_account_asset_asset +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_form +msgid "Asset" +msgstr "" + +#. module: account_asset +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,method:0 +msgid "Linear" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Change duration" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,child_ids:0 +msgid "Child assets" +msgstr "" + +#. module: account_asset +#: field:account.asset.board,value_asset:0 +msgid "Asset Value" +msgstr "" + +#. module: account_asset +#: wizard_field:account.asset.modify,init,name:0 +msgid "Reason" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +#: field:account.asset.asset,entry_ids:0 +#: wizard_field:account.asset.compute,asset_compute,move_ids:0 +msgid "Entries" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.compute,asset_compute:0 +msgid "Generated entries" +msgstr "" + +#. module: account_asset +#: wizard_field:account.asset.modify,init,method_delay:0 +#: field:account.asset.property,method_delay:0 +#: field:account.asset.property.history,method_delay:0 +msgid "Number of interval" +msgstr "" + +#. module: account_asset +#: wizard_button:account.asset.compute,asset_compute,asset_open:0 +msgid "Open entries" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list +#: model:ir.ui.menu,name:account_asset.menu_finance_Assets +#: model:ir.ui.menu,name:account_asset.menu_finance_config_Assets +msgid "Assets" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,method:0 +msgid "Progressive" +msgstr "" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list_draft +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list_draft +msgid "Draft Assets" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.modify,init:0 +#: wizard_field:account.asset.modify,init,note:0 +#: view:account.asset.property.history:0 +msgid "Notes" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Change history" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Depreciation entries" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Methods" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.modify,init:0 +msgid "Asset properties to modify" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,partner_id:0 +msgid "Partner" +msgstr "" + +#. module: account_asset +#: wizard_field:account.asset.modify,init,method_period:0 +#: field:account.asset.property,method_period:0 +#: field:account.asset.property.history,method_period:0 +msgid "Period per interval" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Depreciation duration" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,account_analytic_id:0 +msgid "Analytic account" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,state:0 +msgid "State" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Depreciation methods" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Other information" +msgstr "" + +#. module: account_asset +#: field:account.asset.board,value_asset_cumul:0 +msgid "Cumul. value" +msgstr "" + +#. module: account_asset +#: view:account.asset.property:0 +msgid "Assets methods" +msgstr "" + +#. module: account_asset +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "" + +#. module: account_asset +#: model:ir.model,name:account_asset.model_account_asset_property +msgid "Asset property" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.compute,asset_compute:0 +#: wizard_view:account.asset.compute,init:0 +#: wizard_button:account.asset.compute,init,asset_compute:0 +#: model:ir.actions.wizard,name:account_asset.wizard_asset_compute +#: model:ir.ui.menu,name:account_asset.menu_wizard_asset_compute +msgid "Compute assets" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.modify,init:0 +#: wizard_button:account.asset.modify,init,asset_modify:0 +#: model:ir.actions.wizard,name:account_asset.wizard_asset_modify +msgid "Modify asset" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Confirm asset" +msgstr "" + +#. module: account_asset +#: view:account.asset.property.history:0 +#: model:ir.model,name:account_asset.model_account_asset_property_history +msgid "Asset history" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,date:0 +msgid "Date created" +msgstr "" + +#. module: account_asset +#: model:ir.module.module,description:account_asset.module_meta_information +msgid "" +"Financial and accounting asset management.\n" +" Allows to define\n" +" * Asset category. \n" +" * Assets.\n" +" *Asset usage period and property.\n" +" " +msgstr "" + +#. module: account_asset +#: field:account.asset.board,value_gross:0 +#: field:account.asset.property,value_total:0 +msgid "Gross value" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,method_time:0 +msgid "Ending period" +msgstr "" + +#. module: account_asset +#: field:account.asset.board,name:0 +msgid "Asset name" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Accounts information" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,note:0 +#: field:account.asset.category,note:0 +#: field:account.asset.property.history,note:0 +msgid "Note" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,state:0 +#: selection:account.asset.property,state:0 +msgid "Draft" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,type:0 +msgid "Depr. method type" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,account_asset_id:0 +msgid "Asset account" +msgstr "" + +#. module: account_asset +#: field:account.asset.property.history,asset_property_id:0 +msgid "Method" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,state:0 +msgid "Normal" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,method_progress_factor:0 +msgid "Progressif factor" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,localisation:0 +msgid "Localisation" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,method:0 +msgid "Computation method" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,method_time:0 +msgid "Time method" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,active:0 +msgid "Active" +msgstr "" + +#. module: account_asset +#: field:account.asset.property.history,user_id:0 +msgid "User" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,property_ids:0 +msgid "Asset method name" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,date:0 +#: field:account.asset.property.history,date:0 +msgid "Date" +msgstr "" + +#. module: account_asset +#: field:account.asset.board,value_net:0 +msgid "Net value" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.close,init:0 +#: model:ir.actions.wizard,name:account_asset.wizard_asset_close +msgid "Close asset" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,history_ids:0 +msgid "History" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,account_actif_id:0 +msgid "Depreciation account" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,period_id:0 +#: wizard_field:account.asset.compute,init,period_id:0 +msgid "Period" +msgstr "" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_account_asset_category_form +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_category_form +msgid "Asset Category" +msgstr "" + +#. module: account_asset +#: wizard_button:account.asset.close,init,end:0 +#: wizard_button:account.asset.compute,init,end:0 +#: wizard_button:account.asset.modify,init,end:0 +msgid "Cancel" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,state:0 +#: wizard_button:account.asset.compute,asset_compute,end:0 +#: selection:account.asset.property,state:0 +msgid "Close" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,state:0 +msgid "Open" +msgstr "" + +#. module: account_asset +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" + +#. module: account_asset +#: model:ir.module.module,shortdesc:account_asset.module_meta_information +msgid "Asset management" +msgstr "" + +#. module: account_asset +#: view:account.asset.board:0 +#: field:account.asset.property,board_ids:0 +#: model:ir.model,name:account_asset.model_account_asset_board +msgid "Asset board" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,state:0 +msgid "Global state" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,method_time:0 +msgid "Delay" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.close,init:0 +msgid "General information" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,journal_analytic_id:0 +msgid "Analytic journal" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,name:0 +msgid "Method name" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,journal_id:0 +msgid "Journal" +msgstr "" + +#. module: account_asset +#: field:account.asset.property.history,name:0 +msgid "History name" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Close method" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,entry_asset_ids:0 +msgid "Asset Entries" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,category_id:0 +#: view:account.asset.category:0 +#: field:account.asset.category,name:0 +#: model:ir.model,name:account_asset.model_account_asset_category +msgid "Asset category" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Depreciation" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,code:0 +#: field:account.asset.category,code:0 +msgid "Asset code" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,value_total:0 +msgid "Total value" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,state:0 +msgid "View" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "General info" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,value_residual:0 +msgid "Residual value" +msgstr "" + +#. module: account_asset +#: wizard_button:account.asset.close,init,asset_close:0 +msgid "End of asset" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,type:0 +msgid "Direct" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,type:0 +msgid "Indirect" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,parent_id:0 +msgid "Parent asset" +msgstr "" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_tree +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_tree +msgid "Asset Hierarchy" +msgstr "" diff --git a/addons/account_followup/__openerp__.py b/addons/account_followup/__openerp__.py index e69434b2a3c..90c89dc89b2 100644 --- a/addons/account_followup/__openerp__.py +++ b/addons/account_followup/__openerp__.py @@ -52,10 +52,11 @@ Note that if you want to check the followup level for a given partner/account en 'security/ir.model.access.csv', 'wizard/account_followup_print_view.xml', 'report/account_followup_report.xml', + 'account_followup_demo.xml', # Defined by default 'account_followup_view.xml', - 'account_followup_data.xml' + 'account_followup_data.xml', ], - 'demo_xml': ['account_followup_demo.xml'], + 'demo_xml': [], 'test': ['test/account_followup.yml'], 'installable': True, 'active': False, diff --git a/addons/account_followup/account_followup_demo.xml b/addons/account_followup/account_followup_demo.xml index 01b275de306..3799033b24a 100644 --- a/addons/account_followup/account_followup_demo.xml +++ b/addons/account_followup/account_followup_demo.xml @@ -3,7 +3,7 @@ - Default follow-up + Default Follow-Up First letter after 15 net days, 30 net days and 45 days end of month levels. diff --git a/addons/account_followup/account_followup_view.xml b/addons/account_followup/account_followup_view.xml index f99a8b2c060..e6aee02ffdc 100644 --- a/addons/account_followup/account_followup_view.xml +++ b/addons/account_followup/account_followup_view.xml @@ -6,7 +6,7 @@ account_followup.followup.line tree - + @@ -19,7 +19,7 @@ account_followup.followup.line form - + @@ -45,7 +45,7 @@ - + @@ -73,10 +73,6 @@ - - - - @@ -169,6 +165,7 @@ account_followup.followup form form,tree + diff --git a/addons/account_sequence/account_sequence.py b/addons/account_sequence/account_sequence.py index 1649a8890fa..8b87b3f40ae 100644 --- a/addons/account_sequence/account_sequence.py +++ b/addons/account_sequence/account_sequence.py @@ -35,7 +35,7 @@ class account_move(osv.osv): seq_no = False for move in self.browse(cr, uid, ids, context=context): if move.journal_id.internal_sequence_id: - seq_no = obj_sequence.get_id(cr, uid, move.journal_id.internal_sequence_id.id, context=context) + seq_no = obj_sequence.next_by_id(cr, uid, move.journal_id.internal_sequence_id.id, context=context) if seq_no: self.write(cr, uid, [move.id], {'internal_sequence_number': seq_no}) return res diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index da9dbe87893..005e5d9ab46 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -674,7 +674,7 @@ class account_voucher(osv.osv): if inv.number: name = inv.number elif inv.journal_id.sequence_id: - name = seq_obj.get_id(cr, uid, inv.journal_id.sequence_id.id) + name = seq_obj.next_by_id(cr, uid, inv.journal_id.sequence_id.id) else: raise osv.except_osv(_('Error !'), _('Please define a sequence on the journal !')) if not inv.reference: diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index 6a9e69ab27e..9c8bdffb35d 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -280,6 +280,7 @@
+ ). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import res_users +import controllers + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/auth_openid/__openerp__.py b/addons/auth_openid/__openerp__.py new file mode 100644 index 00000000000..733008ac6e5 --- /dev/null +++ b/addons/auth_openid/__openerp__.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2011 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +{ + 'name': 'OpenID', + 'version': '2.0', + 'category': 'Authentification', + 'description': """Allow users to login through OpenID.""", + 'author': 'OpenERP s.a.', + 'maintainer': 'OpenERP s.a.', + 'website': 'http://www.openerp.com', + 'depends': ['base'], + 'data': [ + 'res_users.xml', + ], + 'js': [ + 'static/src/js/auth_openid.js', + ], + 'css': [ + 'static/src/css/openid.css', + ], + 'external_dependencies': { + 'python' : ['openid'], + }, + 'installable': True, + 'active': False, +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auth_openid/controllers/__init__.py b/addons/auth_openid/controllers/__init__.py new file mode 100644 index 00000000000..2d3be24431f --- /dev/null +++ b/addons/auth_openid/controllers/__init__.py @@ -0,0 +1,20 @@ +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2011 OpenERP SA (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import main diff --git a/addons/auth_openid/controllers/main.py b/addons/auth_openid/controllers/main.py new file mode 100644 index 00000000000..056fc2b6832 --- /dev/null +++ b/addons/auth_openid/controllers/main.py @@ -0,0 +1,225 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2011 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import logging +import os +import sys +import urllib + +import werkzeug.urls +import werkzeug.exceptions + +from openerp.modules.registry import RegistryManager +import web.common.dispatch as openerpweb + +from openid import oidutil +from openid.store import memstore +#from openid.store import filestore +from openid.consumer import consumer +from openid.cryptutil import randomString +from openid.extensions import ax, sreg + +from .. import utils + + + +_logger = logging.getLogger('web.auth_openid') +oidutil.log = logging.getLogger('openid').debug + + +class GoogleAppsAwareConsumer(consumer.GenericConsumer): + def complete(self, message, endpoint, return_to): + if message.getOpenIDNamespace() == consumer.OPENID2_NS: + server_url = message.getArg(consumer.OPENID2_NS, 'op_endpoint', consumer.no_default) + if server_url.startswith('https://www.google.com/a/'): + # update fields + for attr in ['claimed_id', 'identity']: + value = message.getArg(consumer.OPENID2_NS, attr) + value = 'https://www.google.com/accounts/o8/user-xrds?uri=%s' % urllib.quote_plus(value) + message.setArg(consumer.OPENID2_NS, attr, value) + + # now, resign the message + assoc_handle = message.getArg(consumer.OPENID_NS, 'assoc_handle') + assoc = self.store.getAssociation(server_url, assoc_handle) + message.delArg(consumer.OPENID2_NS, 'sig') + message.delArg(consumer.OPENID2_NS, 'signed') + message = assoc.signMessage(message) + + return super(GoogleAppsAwareConsumer, self).complete(message, endpoint, return_to) + + +class OpenIDController(openerpweb.Controller): + _cp_path = '/auth_openid/login' + + _store = memstore.MemoryStore() # TODO use a filestore + + _REQUIRED_ATTRIBUTES = ['email'] + _OPTIONAL_ATTRIBUTES = 'nickname fullname postcode country language timezone'.split() + + + def _add_extensions(self, request): + """Add extensions to the request""" + + sreg_request = sreg.SRegRequest(required=self._REQUIRED_ATTRIBUTES, + optional=self._OPTIONAL_ATTRIBUTES) + request.addExtension(sreg_request) + + ax_request = ax.FetchRequest() + for alias in self._REQUIRED_ATTRIBUTES: + uri = utils.SREG2AX[alias] + ax_request.add(ax.AttrInfo(uri, required=True, alias=alias)) + for alias in self._OPTIONAL_ATTRIBUTES: + uri = utils.SREG2AX[alias] + ax_request.add(ax.AttrInfo(uri, required=False, alias=alias)) + + request.addExtension(ax_request) + + def _get_attributes_from_success_response(self, success_response): + attrs = {} + + all_attrs = self._REQUIRED_ATTRIBUTES + self._OPTIONAL_ATTRIBUTES + + sreg_resp = sreg.SRegResponse.fromSuccessResponse(success_response) + if sreg_resp: + for attr in all_attrs: + value = sreg_resp.get(attr) + if value is not None: + attrs[attr] = value + + ax_resp = ax.FetchResponse.fromSuccessResponse(success_response) + if ax_resp: + for attr in all_attrs: + value = ax_resp.getSingle(utils.SREG2AX[attr]) + if value is not None: + attrs[attr] = value + return attrs + + def _get_realm(self, req): + return req.httprequest.host_url + + @openerpweb.jsonrequest + def verify(self, req, db, url): + redirect_to = werkzeug.urls.Href(req.httprequest.host_url + 'auth_openid/login/process')(session_id=req.session_id) + realm = self._get_realm(req) + + session = dict(dbname=db, openid_url=url) # TODO add origin page ? + oidconsumer = consumer.Consumer(session, self._store) + + try: + request = oidconsumer.begin(url) + except consumer.DiscoveryFailure, exc: + fetch_error_string = 'Error in discovery: %s' % (str(exc[0]),) + return {'error': fetch_error_string, 'title': 'OpenID Error'} + + if request is None: + return {'error': 'No OpenID services found', 'title': 'OpenID Error'} + + req.session.openid_session = session + self._add_extensions(request) + + if request.shouldSendRedirect(): + redirect_url = request.redirectURL(realm, redirect_to) + return {'action': 'redirect', 'value': redirect_url, 'session_id': req.session_id} + else: + form_html = request.htmlMarkup(realm, redirect_to) + return {'action': 'post', 'value': form_html, 'session_id': req.session_id} + + + @openerpweb.httprequest + def process(self, req, **kw): + session = getattr(req.session, 'openid_session', None) + if not session: + return werkzeug.utils.redirect('/') + + oidconsumer = consumer.Consumer(session, self._store, consumer_class=GoogleAppsAwareConsumer) + + query = req.httprequest.args + info = oidconsumer.complete(query, req.httprequest.base_url) + display_identifier = info.getDisplayIdentifier() + + session['status'] = info.status + user_id = None + + if info.status == consumer.SUCCESS: + dbname = session['dbname'] + with utils.cursor(dbname) as cr: + registry = RegistryManager.get(dbname) + Modules = registry.get('ir.module.module') + + installed = Modules.search_count(cr, 1, ['&', ('name', '=', 'auth_openid'), ('state', '=', 'installed')]) == 1 + if installed: + + Users = registry.get('res.users') + + #openid_url = info.endpoint.canonicalID or display_identifier + openid_url = session['openid_url'] + + attrs = self._get_attributes_from_success_response(info) + attrs['openid_url'] = openid_url + session['attributes'] = attrs + openid_email = attrs.get('email', False) + + domain = [] + if openid_email: + domain += ['|', ('openid_email', '=', False)] + domain += [('openid_email', '=', openid_email)] + + domain += [ + ('openid_url', '=', openid_url), + ('active', '=', True), + ] + ids = Users.search(cr, 1, domain) + assert len(ids) < 2 + if ids: + user_id = ids[0] + login = Users.browse(cr, 1, user_id).login + key = randomString(utils.KEY_LENGTH, '0123456789abcdef') + Users.write(cr, 1, [user_id], {'openid_key': key}) + # TODO fill empty fields with the ones from sreg/ax + cr.commit() + + u = req.session.login(dbname, login, key) + + if not user_id: + session['message'] = 'This OpenID identifier is not associated to any active users' + + + elif info.status == consumer.SETUP_NEEDED: + session['message'] = info.setup_url + elif info.status == consumer.FAILURE and display_identifier: + fmt = "Verification of %s failed: %s" + session['message'] = fmt % (display_identifier, info.message) + else: # FAILURE + # Either we don't understand the code or there is no + # openid_url included with the error. Give a generic + # failure message. The library should supply debug + # information in a log. + session['message'] = 'Verification failed.' + + + fragment = '#loginerror' if not user_id else '' + return werkzeug.utils.redirect('/web/webclient/home?debug=1'+fragment) + + @openerpweb.jsonrequest + def status(self, req): + session = getattr(req.session, 'openid_session', {}) + return {'status': session.get('status'), 'message': session.get('message')} + diff --git a/addons/auth_openid/res_users.py b/addons/auth_openid/res_users.py new file mode 100644 index 00000000000..3278184474c --- /dev/null +++ b/addons/auth_openid/res_users.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2011 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from openerp.osv import osv, fields +import openerp.exceptions +import tools + +import utils + +class res_users(osv.osv): + _inherit = 'res.users' + + # TODO create helper fields for autofill openid_url and openid_email -> http://pad.openerp.com/web-openid + + _columns = { + 'openid_url': fields.char('OpenID URL', size=1024), + 'openid_email': fields.char('OpenID Email', size=256, + help="Used for disambiguation in case of a shared OpenID URL"), + 'openid_key': fields.char('OpenID Key', size=utils.KEY_LENGTH, + readonly=True), + } + + def _check_openid_url_email(self, cr, uid, ids, context=None): + return all(self.search_count(cr, uid, [('active', '=', True), ('openid_url', '=', u.openid_url), ('openid_email', '=', u.openid_email)]) == 1 \ + for u in self.browse(cr, uid, ids, context) if u.active and u.openid_url) + + def _check_openid_url_email_msg(self, cr, uid, ids, context): + return "There is already an active user with this OpenID Email for this OpenID URL" + + _constraints = [ + (_check_openid_url_email, lambda self, *a, **kw: self._check_openid_url_email_msg(*a, **kw), ['active', 'openid_url', 'openid_email']), + ] + + def copy(self, cr, uid, rid, defaults=None, context=None): + reset_fields = 'openid_url openid_email'.split() + reset_values = dict.fromkeys(reset_fields, False) + if defaults is None: + defaults = reset_values + else: + defaults = dict(reset_values, **defaults) + + defaults['openid_key'] = False + return super(res_users, self).copy(cr, uid, rid, defaults, context) + + def login(self, db, login, password): + result = super(res_users, self).login(db, login, password) + if result: + return result + else: + with utils.cursor(db) as cr: + cr.execute('UPDATE res_users SET date=now() WHERE login=%s AND openid_key=%s AND active=%s RETURNING id', + (tools.ustr(login), tools.ustr(password), True)) + res = cr.fetchone() + cr.commit() + return res[0] if res else False + + + def check(self, db, uid, passwd): + try: + return super(res_users, self).check(db, uid, passwd) + except openerp.exceptions.AccessDenied: + if not passwd: + raise + with utils.cursor(db) as cr: + cr.execute('''SELECT COUNT(1) + FROM res_users + WHERE id=%s + AND openid_key=%s + AND active=%s''', + (int(uid), passwd, True)) + if not cr.fetchone()[0]: + raise + self._uid_cache.setdefault(db, {})[uid] = passwd + +res_users() + + diff --git a/addons/auth_openid/res_users.xml b/addons/auth_openid/res_users.xml new file mode 100644 index 00000000000..e32c2df26c8 --- /dev/null +++ b/addons/auth_openid/res_users.xml @@ -0,0 +1,20 @@ + + + + + res.users.form + res.users + form + + + + + + + + + + + + + diff --git a/addons/auth_openid/static/src/css/openid.css b/addons/auth_openid/static/src/css/openid.css new file mode 100644 index 00000000000..8763ec31685 --- /dev/null +++ b/addons/auth_openid/static/src/css/openid.css @@ -0,0 +1,64 @@ +input[name='openid_url'] { + background: #fff url(../img/login-bg.gif) no-repeat 1px; + padding-left: 20px; +} + +.auth_choice { + position: static; + display: none; +} + +.openerp .login .oe_forms .oe_box2 td input[name="db"], .oe_forms .oe_box2 td select[name="db"] { + width: 50%; + float: left; + margin-top: 15px; +} + +.openerp .login .oe_login_right_pane { + margin-left: 525px; +} +.openerp .login form { + width: 475px; +} + +.openid_providers { + padding: 0; + list-style: none; + float: right; +} + +.openid_providers li { + display: block; + float: left; + margin: 0 1px 3px 2px; +} + +.openid_providers a { + display: block; + width: 24px; + height: 24px; + border: 1px solid #ddd; + background: #fff url(../img/openid_16.png) no-repeat 50%; + text-indent: -9999px; + overflow: hidden; + text-align: left; +} + +.openid_providers a.selected { + border-color: #9A0404; +} + +.openid_providers a[title="Password"] { background-image: url(../img/textfield_key.png); } +.openid_providers a[title="AOL"] { background-image: url(../img/aol.png); } +.openid_providers a[title="ClaimID"] { background-image: url(../img/claimid.png); } +.openid_providers a[title="Google"] { background-image: url(../img/googlefav.png); } +.openid_providers a[title="Google Apps"] { background-image: url(../img/marketplace.gif); } +.openid_providers a[title="MyOpenID"] { background-image: url(../img/myopenid.png); } +.openid_providers a[title="VeriSign"] { background-image: url(../img/verisign.png); } +.openid_providers a[title="Yahoo!"] { background-image: url(../img/yahoo.png); } +.openid_providers a[title="Launchpad"] { background-image: url(../img/launchpad.png); } + + +tr.auth_choice.selected { + display: table-row; +} diff --git a/addons/auth_openid/static/src/img/aol.png b/addons/auth_openid/static/src/img/aol.png new file mode 100644 index 00000000000..93584e56749 Binary files /dev/null and b/addons/auth_openid/static/src/img/aol.png differ diff --git a/addons/auth_openid/static/src/img/claimid.png b/addons/auth_openid/static/src/img/claimid.png new file mode 100644 index 00000000000..41be7fc8f9e Binary files /dev/null and b/addons/auth_openid/static/src/img/claimid.png differ diff --git a/addons/auth_openid/static/src/img/google.png b/addons/auth_openid/static/src/img/google.png new file mode 100644 index 00000000000..d8b8b2a7abb Binary files /dev/null and b/addons/auth_openid/static/src/img/google.png differ diff --git a/addons/auth_openid/static/src/img/googleapps.gif b/addons/auth_openid/static/src/img/googleapps.gif new file mode 100644 index 00000000000..f86bc8956d2 Binary files /dev/null and b/addons/auth_openid/static/src/img/googleapps.gif differ diff --git a/addons/auth_openid/static/src/img/googlefav.png b/addons/auth_openid/static/src/img/googlefav.png new file mode 100644 index 00000000000..1604ac0baa5 Binary files /dev/null and b/addons/auth_openid/static/src/img/googlefav.png differ diff --git a/addons/auth_openid/static/src/img/launchpad.gif b/addons/auth_openid/static/src/img/launchpad.gif new file mode 100644 index 00000000000..48e7ba4f5b0 Binary files /dev/null and b/addons/auth_openid/static/src/img/launchpad.gif differ diff --git a/addons/auth_openid/static/src/img/launchpad.png b/addons/auth_openid/static/src/img/launchpad.png new file mode 100644 index 00000000000..7db6e67f8b5 Binary files /dev/null and b/addons/auth_openid/static/src/img/launchpad.png differ diff --git a/addons/auth_openid/static/src/img/login-bg.gif b/addons/auth_openid/static/src/img/login-bg.gif new file mode 100644 index 00000000000..e2d8377db02 Binary files /dev/null and b/addons/auth_openid/static/src/img/login-bg.gif differ diff --git a/addons/auth_openid/static/src/img/marketplace.gif b/addons/auth_openid/static/src/img/marketplace.gif new file mode 100644 index 00000000000..a3e4d2cd606 Binary files /dev/null and b/addons/auth_openid/static/src/img/marketplace.gif differ diff --git a/addons/auth_openid/static/src/img/myopenid.png b/addons/auth_openid/static/src/img/myopenid.png new file mode 100644 index 00000000000..d00ca76543b Binary files /dev/null and b/addons/auth_openid/static/src/img/myopenid.png differ diff --git a/addons/auth_openid/static/src/img/openid.png b/addons/auth_openid/static/src/img/openid.png new file mode 100644 index 00000000000..280ee6ce3b7 Binary files /dev/null and b/addons/auth_openid/static/src/img/openid.png differ diff --git a/addons/auth_openid/static/src/img/openid_16.png b/addons/auth_openid/static/src/img/openid_16.png new file mode 100644 index 00000000000..eadf8e8577f Binary files /dev/null and b/addons/auth_openid/static/src/img/openid_16.png differ diff --git a/addons/auth_openid/static/src/img/textfield_key.png b/addons/auth_openid/static/src/img/textfield_key.png new file mode 100644 index 00000000000..a9d5e4f8cc7 Binary files /dev/null and b/addons/auth_openid/static/src/img/textfield_key.png differ diff --git a/addons/auth_openid/static/src/img/verisign.png b/addons/auth_openid/static/src/img/verisign.png new file mode 100644 index 00000000000..fe890ca7aeb Binary files /dev/null and b/addons/auth_openid/static/src/img/verisign.png differ diff --git a/addons/auth_openid/static/src/img/yahoo.png b/addons/auth_openid/static/src/img/yahoo.png new file mode 100644 index 00000000000..5fbf752d9b5 Binary files /dev/null and b/addons/auth_openid/static/src/img/yahoo.png differ diff --git a/addons/auth_openid/static/src/js/auth_openid.js b/addons/auth_openid/static/src/js/auth_openid.js new file mode 100644 index 00000000000..7399e1fb371 --- /dev/null +++ b/addons/auth_openid/static/src/js/auth_openid.js @@ -0,0 +1,135 @@ + +openerp.auth_openid = function(instance) { + +var QWeb = instance.web.qweb; +QWeb.add_template('/auth_openid/static/src/xml/auth_openid.xml'); + +instance.web.Login = instance.web.Login.extend({ + start: function() { + this._super.apply(this, arguments); + var self = this; + + this.$openid_selected_button = $(); + this.$openid_selected_input = $(); + this.$openid_selected_provider = null; + + + var openIdProvider = null; + if (this.has_local_storage && this.remember_creditentials) { + openIdProvider = localStorage.getItem('openid-provider'); + } + + if (openIdProvider) { + $openid_selected_provider = openIdProvider; + this.do_openid_select('a[href="#' + openIdProvider + '"]', openIdProvider, true); + + if (this.has_local_storage && this.remember_creditentials) { + this.$openid_selected_input.find('input').val(localStorage.getItem('openid-login')); + } + } + else { + this.do_openid_select('a[data-url=""]', 'login,password', true); + } + + this.$element.find('a[data-url]').click(function (event) { + event.preventDefault(); + var selected_oidh = $(this).attr('href').substr(1); + if (selected_oidh != self.$openid_selected_provider) { + self.do_openid_select(this, selected_oidh); + } + }); + + }, + + + do_openid_select: function (button, provider, noautosubmit) { + var self = this; + + self.$openid_selected_button.add(self.$openid_selected_input).removeClass('selected'); + self.$openid_selected_button = self.$element.find(button).addClass('selected'); + + var input = _(provider.split(',')).map(function(p) { return 'tr[data-provider="'+p+'"]'; }).join(','); + self.$openid_selected_input = self.$element.find(input).addClass('selected'); + + self.$openid_selected_input.find('input:first').focus(); + self.$openid_selected_provider = (self.$openid_selected_button.attr('href') || '').substr(1); + + if (self.has_local_storage && self.remember_creditentials) { + localStorage.setItem('openid-provider', self.$openid_selected_provider); + } + + if (!noautosubmit && self.$openid_selected_input.length == 0) { + self.$element.find('form').submit(); + } + + }, + + on_login_invalid: function() { + var self = this; + var fragment = jQuery.deparam.fragment(); + if (fragment.loginerror != undefined) { + this.rpc('/auth_openid/login/status', {}, function(result) { + if (_.contains(['success', 'failure'], result.status) && result.message) { + self.notification.warn('Invalid OpenID Login', result.message); + } + if (result.status === 'setup_needed' && result.message) { + window.location.replace(result.message); + } + }); + } + return this._super(); + }, + + on_submit: function(ev) { + + var dataurl = this.$openid_selected_button.attr('data-url'); + + if(!dataurl) { + // login-password submitted + this._super(ev); + } else { + ev.preventDefault(); + + var id = this.$openid_selected_input.find('input').val(); + if (this.has_local_storage && this.remember_creditentials) { + localStorage.setItem('openid-login', id); + } + + var db = this.$element.find("form [name=db]").val(); + var openid_url = dataurl.replace('{id}', id); + + this.do_openid_login(db, openid_url); + + } + }, + + do_openid_login: function(db, openid_url) { + var self = this; + this.rpc('/auth_openid/login/verify', {'db': db, 'url': openid_url}, function(result) { + if (result.error) { + self.notification.warn(result.title, result.error); + self.on_login_invalid(); + return; + } + if (result.session_id) { + self.session.session_id = result.session_id; + self.session.session_save(); + } + if (result.action === 'post') { + document.open(); + document.write(result.value); + document.close(); + } else if (result.action === 'redirect') { + window.location.replace(result.value); + } else { + // XXX display error ? + } + + }); + }, + + +}); + + +}; diff --git a/addons/auth_openid/static/src/xml/auth_openid.xml b/addons/auth_openid/static/src/xml/auth_openid.xml new file mode 100644 index 00000000000..6fbab72e831 --- /dev/null +++ b/addons/auth_openid/static/src/xml/auth_openid.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //this.addClass('auth_choice'); // XXX for some reason, not all tr tags are HTMLElement's and thus, jQuery decide to not change the class... + this.attr('class', 'auth_choice'); + this.each(function() { + var $i = $(this); + $i.attr('data-provider', $i.find('input').attr('name')); + }); + + + + diff --git a/addons/auth_openid/utils.py b/addons/auth_openid/utils.py new file mode 100644 index 00000000000..2761f3d0e1d --- /dev/null +++ b/addons/auth_openid/utils.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2011 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from contextlib import contextmanager +from openerp.modules.registry import RegistryManager + +KEY_LENGTH = 16 + +SREG2AX = { # from http://www.axschema.org/types/#sreg + 'nickname': 'http://axschema.org/namePerson/friendly', + 'email': 'http://axschema.org/contact/email', + 'fullname': 'http://axschema.org/namePerson', + 'dob': 'http://axschema.org/birthDate', + 'gender': 'http://axschema.org/person/gender', + 'postcode': 'http://axschema.org/contact/postalCode/home', + 'country': 'http://axschema.org/contact/country/home', + 'language': 'http://axschema.org/pref/language', + 'timezone': 'http://axschema.org/pref/timezone', +} + + +@contextmanager +def cursor(db): + cr = RegistryManager.get(db).db.cursor() + try: + yield cr + finally: + cr.close() + diff --git a/addons/base_report_designer/base_report_designer_installer.xml b/addons/base_report_designer/base_report_designer_installer.xml index b943c35c2ef..2774767af26 100644 --- a/addons/base_report_designer/base_report_designer_installer.xml +++ b/addons/base_report_designer/base_report_designer_installer.xml @@ -22,8 +22,8 @@