summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorFabien Pinckaers <fp@tinyerp.com>2011-10-01 20:48:11 +0200
committerFabien Pinckaers <fp@tinyerp.com>2011-10-01 20:48:11 +0200
commit57b86a10409f08345bfb2e14d039289ae4603104 (patch)
tree957fa49ea222687ff62bc778ae6be594cd905429 /addons
parentac214af8d058902d443792ee41cc2e4f9721bb5d (diff)
parent84f188ce7d08d5a6d515b5d07d365ed930668ffe (diff)
merge
bzr revid: fp@tinyerp.com-20111001184811-umj7qepl2ly9jh0d
Diffstat (limited to 'addons')
-rw-r--r--addons/account/__init__.py4
-rw-r--r--addons/account/__openerp__.py5
-rw-r--r--addons/account/account.py28
-rw-r--r--addons/account/account_bank_statement.py4
-rw-r--r--addons/account/account_cash_statement.py4
-rw-r--r--addons/account/account_invoice.py (renamed from addons/account/invoice.py)0
-rw-r--r--addons/account/account_move_line.py2
-rw-r--r--addons/account/data/account_data.xml (renamed from addons/account/data/account_data2.xml)67
-rw-r--r--addons/account/data/account_invoice.xml75
-rw-r--r--addons/account/i18n/ar.po10
-rw-r--r--addons/account/i18n/et.po8
-rw-r--r--addons/account/ir_sequence.py (renamed from addons/account/sequence.py)25
-rw-r--r--addons/account/ir_sequence_view.xml (renamed from addons/account/sequence_view.xml)0
-rw-r--r--addons/account/test/account_fiscalyear_close.yml1
-rw-r--r--addons/account_asset/i18n/pt_BR.po529
-rw-r--r--addons/account_sequence/account_sequence.py2
-rw-r--r--addons/account_voucher/account_voucher.py2
-rw-r--r--addons/auth_openid/__init__.py26
-rw-r--r--addons/auth_openid/__openerp__.py47
-rw-r--r--addons/auth_openid/controllers/__init__.py20
-rw-r--r--addons/auth_openid/controllers/main.py225
-rw-r--r--addons/auth_openid/res_users.py94
-rw-r--r--addons/auth_openid/res_users.xml20
-rw-r--r--addons/auth_openid/static/src/css/openid.css64
-rw-r--r--addons/auth_openid/static/src/img/aol.pngbin0 -> 2843 bytes
-rw-r--r--addons/auth_openid/static/src/img/claimid.pngbin0 -> 1315 bytes
-rw-r--r--addons/auth_openid/static/src/img/google.pngbin0 -> 2061 bytes
-rw-r--r--addons/auth_openid/static/src/img/googleapps.gifbin0 -> 4607 bytes
-rw-r--r--addons/auth_openid/static/src/img/googlefav.pngbin0 -> 940 bytes
-rw-r--r--addons/auth_openid/static/src/img/launchpad.gifbin0 -> 6208 bytes
-rw-r--r--addons/auth_openid/static/src/img/launchpad.pngbin0 -> 419 bytes
-rw-r--r--addons/auth_openid/static/src/img/login-bg.gifbin0 -> 328 bytes
-rw-r--r--addons/auth_openid/static/src/img/marketplace.gifbin0 -> 1065 bytes
-rw-r--r--addons/auth_openid/static/src/img/myopenid.pngbin0 -> 320 bytes
-rw-r--r--addons/auth_openid/static/src/img/openid.pngbin0 -> 1120 bytes
-rw-r--r--addons/auth_openid/static/src/img/openid_16.pngbin0 -> 671 bytes
-rw-r--r--addons/auth_openid/static/src/img/textfield_key.pngbin0 -> 455 bytes
-rw-r--r--addons/auth_openid/static/src/img/verisign.pngbin0 -> 520 bytes
-rw-r--r--addons/auth_openid/static/src/img/yahoo.pngbin0 -> 2302 bytes
-rw-r--r--addons/auth_openid/static/src/js/auth_openid.js135
-rw-r--r--addons/auth_openid/static/src/xml/auth_openid.xml45
-rw-r--r--addons/auth_openid/utils.py46
-rw-r--r--addons/l10n_ch/journal_data.xml6
-rw-r--r--addons/point_of_sale/wizard/pos_open_statement.py4
-rw-r--r--addons/sale/test/data_test.yml3
-rw-r--r--addons/stock/stock_data.xml7
-rw-r--r--addons/web_livechat/LICENSE2
-rw-r--r--addons/web_livechat/__openerp__.py15
-rw-r--r--addons/web_livechat/publisher_warranty.py2
-rw-r--r--addons/web_livechat/static/src/css/lc.css (renamed from addons/web_livechat/web/static/css/lc.css)4
-rw-r--r--addons/web_livechat/static/src/img/available.pngbin0 -> 1153 bytes
-rw-r--r--addons/web_livechat/static/src/img/away.pngbin0 -> 1398 bytes
-rw-r--r--addons/web_livechat/static/src/img/busy.pngbin0 -> 1145 bytes
-rw-r--r--addons/web_livechat/static/src/js/web_livechat.js100
-rw-r--r--addons/web_livechat/static/src/xml/web_livechat.xml8
-rw-r--r--addons/web_livechat/web/__init__.py5
-rw-r--r--addons/web_livechat/web/editors.py93
-rw-r--r--addons/web_uservoice/__openerp__.py1
58 files changed, 1456 insertions, 282 deletions
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 d1726d164b6..19662ea2f33 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 2f835ddacb3..b5d52dc680f 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -672,32 +672,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 +1204,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 !'))
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_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/invoice.py b/addons/account/account_invoice.py
index 834da02d1b4..834da02d1b4 100644
--- a/addons/account/invoice.py
+++ b/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/data/account_data2.xml b/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
-->
- <record id="sequence_journal_type" model="ir.sequence.type">
- <field name="name">Account Journal</field>
- <field name="code">account.journal</field>
- </record>
- <record id="sequence_journal" model="ir.sequence">
- <field name="name">Account Journal</field>
- <field name="code">account.journal</field>
- <field name="prefix"/>
- </record>
<record id="sequence_sale_journal" model="ir.sequence">
- <field name="name">Sale Journal</field>
- <field name="code">account.journal</field>
+ <field name="name">Account Default Sales Journal</field>
<field eval="3" name="padding"/>
<field name="prefix">SAJ/%(year)s/</field>
</record>
<record id="sequence_refund_sales_journal" model="ir.sequence">
- <field name="name">Sales Credit Note Journal</field>
- <field name="code">account.journal</field>
+ <field name="name">Account Default Sales Credit Note Journal</field>
<field eval="3" name="padding"/>
<field name="prefix">SCNJ/%(year)s/</field>
</record>
<record id="sequence_purchase_journal" model="ir.sequence">
- <field name="name">Purchase Journal</field>
- <field name="code">account.journal</field>
+ <field name="name">Account Default Expenses Journal</field>
<field eval="3" name="padding"/>
<field name="prefix">EXJ/%(year)s/</field>
</record>
<record id="sequence_refund_purchase_journal" model="ir.sequence">
- <field name="name">Expenses Credit Notes Journal</field>
- <field name="code">account.journal</field>
+ <field name="name">Account Default Expenses Credit Notes Journal</field>
<field eval="3" name="padding"/>
<field name="prefix">ECNJ/%(year)s/</field>
</record>
<record id="sequence_bank_journal" model="ir.sequence">
- <field name="name">Bank Journal</field>
- <field name="code">account.journal</field>
+ <field name="name">Account Default Bank Journal</field>
<field eval="3" name="padding"/>
<field name="prefix">BNK/%(year)s/</field>
</record>
<record id="sequence_check_journal" model="ir.sequence">
- <field name="name">Checks Journal</field>
- <field name="code">account.journal</field>
+ <field name="name">Account Default Checks Journal</field>
<field eval="3" name="padding"/>
<field name="prefix">CHK/%(year)s/</field>
</record>
<record id="sequence_cash_journal" model="ir.sequence">
- <field name="name">Cash Journal</field>
- <field name="code">account.journal</field>
+ <field name="name">Account Default Cash Journal</field>
<field eval="3" name="padding"/>
<field name="prefix">CSH/%(year)s/</field>
</record>
<record id="sequence_opening_journal" model="ir.sequence">
- <field name="name">Opening Entries Journal</field>
- <field name="code">account.journal</field>
+ <field name="name">Account Default Opening Entries Journal</field>
<field eval="3" name="padding"/>
<field name="prefix">OPEJ/%(year)s/</field>
</record>
<record id="sequence_miscellaneous_journal" model="ir.sequence">
- <field name="name">Miscellaneous Journal</field>
- <field name="code">account.journal</field>
+ <field name="name">Account Default Miscellaneous Journal</field>
<field eval="3" name="padding"/>
<field name="prefix">MISJ/%(year)s/</field>
</record>
@@ -538,7 +520,7 @@
-->
<record id="sequence_reconcile" model="ir.sequence.type">
- <field name="name">Account reconcile sequence</field>
+ <field name="name">Account Reconcile</field>
<field name="code">account.reconcile</field>
</record>
<record id="sequence_reconcile_seq" model="ir.sequence">
@@ -550,7 +532,7 @@
</record>
<record id="sequence_statement_type" model="ir.sequence.type">
- <field name="name">Bank Statement</field>
+ <field name="name">Account Bank Statement</field>
<field name="code">account.bank.statement</field>
</record>
<record id="sequence_statement" model="ir.sequence">
@@ -562,7 +544,7 @@
</record>
<record id="cash_sequence_statement_type" model="ir.sequence.type">
- <field name="name">Cash Statement</field>
+ <field name="name">Account Cash Statement</field>
<field name="code">account.cash.statement</field>
</record>
<record id="cash_sequence_statement" model="ir.sequence">
@@ -572,5 +554,30 @@
<field eval="1" name="number_next"/>
<field eval="1" name="number_increment"/>
</record>
+
+ <!--
+ Sequence for analytic account
+ -->
+ <record id="seq_type_analytic_account" model="ir.sequence.type">
+ <field name="name">Analytic account</field>
+ <field name="code">account.analytic.account</field>
+ </record>
+ <record id="seq_analytic_account" model="ir.sequence">
+ <field name="name">Analytic account sequence</field>
+ <field name="code">account.analytic.account</field>
+ <field eval="3" name="padding"/>
+ <field eval="2708" name="number_next"/>
+ </record>
+
+ <!--
+ Invoice requests (deprecated)
+ -->
+ <record id="req_link_invoice" model="res.request.link">
+ <field name="name">Invoice</field>
+ <field name="object">account.invoice</field>
+ </record>
+
+
+
</data>
</openerp>
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 @@
-<?xml version="1.0" encoding="utf-8"?>
-<openerp>
- <data noupdate="1">
- <record id="req_link_invoice" model="res.request.link">
- <field name="name">Invoice</field>
- <field name="object">account.invoice</field>
- </record>
-
- <!--
- Sequences types for invoices
- -->
- <record id="seq_type_out_invoice" model="ir.sequence.type">
- <field name="name">Account Invoice Out</field>
- <field name="code">account.invoice.out_invoice</field>
- </record>
- <record id="seq_type_in_invoice" model="ir.sequence.type">
- <field name="name">Account Invoice In</field>
- <field name="code">account.invoice.in_invoice</field>
- </record>
- <record id="seq_type_out_refund" model="ir.sequence.type">
- <field name="name">Account Refund Out</field>
- <field name="code">account.invoice.out_refund</field>
- </record>
- <record id="seq_type_in_refund" model="ir.sequence.type">
- <field name="name">Account Refund In</field>
- <field name="code">account.invoice.in_refund</field>
- </record>
-
- <!--
- Sequences for invoices
- -->
- <record id="seq_out_invoice" model="ir.sequence">
- <field name="name">Account Invoice Out</field>
- <field name="code">account.invoice.out_invoice</field>
- <field eval="3" name="padding"/>
- <field name="prefix">%(year)s/</field>
- </record>
- <record id="seq_in_invoice" model="ir.sequence">
- <field name="name">Account Invoice In</field>
- <field name="code">account.invoice.in_invoice</field>
- <field eval="3" name="padding"/>
- <field name="prefix">%(year)s/</field>
- </record>
- <record id="seq_out_refund" model="ir.sequence">
- <field name="name">Account Refund Out</field>
- <field name="code">account.invoice.out_refund</field>
- <field eval="3" name="padding"/>
- <field name="prefix">%(year)s/</field>
- </record>
- <record id="seq_in_refund" model="ir.sequence">
- <field name="name">Account Refund In</field>
- <field name="code">account.invoice.in_refund</field>
- <field eval="3" name="padding"/>
- <field name="prefix">%(year)s/</field>
- </record>
-
- <!--
- Sequences types for analytic account
- -->
- <record id="seq_type_analytic_account" model="ir.sequence.type">
- <field name="name">Analytic account</field>
- <field name="code">account.analytic.account</field>
- </record>
-
- <!--
- Sequence for analytic account
- -->
- <record id="seq_analytic_account" model="ir.sequence">
- <field name="name">Analytic account sequence</field>
- <field name="code">account.analytic.account</field>
- <field eval="3" name="padding"/>
- <field eval="2708" name="number_next"/>
- </record>
- </data>
-</openerp>
diff --git a/addons/account/i18n/ar.po b/addons/account/i18n/ar.po
index 170ac722c7a..e3e9c9669a3 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 <Unknown>\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-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 "نظام الدفع"
#. 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 b671a24e720..ff6ae9bfc3a 100644
--- a/addons/account/i18n/et.po
+++ b/addons/account/i18n/et.po
@@ -7,13 +7,13 @@ 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-28 14:57+0000\n"
+"PO-Revision-Date: 2011-09-30 07:02+0000\n"
"Last-Translator: Raiko Pajur <Unknown>\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-30 04:40+0000\n"
+"X-Launchpad-Export-Date: 2011-10-01 05:08+0000\n"
"X-Generator: Launchpad (build 14071)\n"
#. module: account
@@ -1895,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
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
index fe34590e78b..fe34590e78b 100644
--- a/addons/account/sequence_view.xml
+++ b/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_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 <EMAIL@ADDRESS>, 2011.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <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: 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_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/auth_openid/__init__.py b/addons/auth_openid/__init__.py
new file mode 100644
index 00000000000..42a28a1b35a
--- /dev/null
+++ b/addons/auth_openid/__init__.py
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2010-2011 OpenERP s.a. (<http://openerp.com>).
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+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. (<http://openerp.com>).
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+{
+ '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 (<http://openerp.com>).
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+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. (<http://openerp.com>).
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+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. (<http://openerp.com>).
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+ <record id="view_users_form" model="ir.ui.view">
+ <field name="name">res.users.form</field>
+ <field name="model">res.users</field>
+ <field name="type">form</field>
+ <field name="inherit_id" ref="base.view_users_form"/>
+ <field name="arch" type="xml">
+ <notebook colspan="4" position="inside">
+ <page string="OpenID">
+ <field name="openid_url"/>
+ <field name="openid_email"/>
+ </page>
+ </notebook>
+ </field>
+ </record>
+ </data>
+</openerp>
+
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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/aol.png
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/claimid.png
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/google.png
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/googleapps.gif
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/googlefav.png
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/launchpad.gif
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/launchpad.png
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/login-bg.gif
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/marketplace.gif
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/myopenid.png
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/openid.png
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/openid_16.png
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/textfield_key.png
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/verisign.png
Binary files 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
--- /dev/null
+++ b/addons/auth_openid/static/src/img/yahoo.png
Binary files 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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vim:fdl=1: -->
+<templates id="template" xml:space="preserve">
+
+ <t t-extend="Login">
+ <t t-jquery=".oe_box2 tr:first td:nth-child(2)" t-operation="append">
+ <ul class="openid_providers">
+ <li><a href="#login,password" title="Password" data-url="" id="btn_password">Password</a></li>
+ <li><a href="#google" title="Google" data-url="https://www.google.com/accounts/o8/id">Google</a></li>
+ <li><a href="#googleapps" title="Google Apps" data-url="https://www.google.com/accounts/o8/site-xrds?hd={id}">Google</a></li>
+ <li><a href="#launchpad" title="Launchpad" data-url="https://launchpad.net/~{id}">Launchpad</a></li>
+ <li><a href="#openid_url" title="OpenID" data-url="{id}">OpenID</a></li>
+ </ul>
+ </t>
+ </t>
+
+ <t t-extend="Login">
+ <t t-jquery=".oe_box2 tr:first" t-operation="after">
+ <tr>
+ <td><label for="googleapps">Google Apps Domain:</label></td>
+ <td><input type="text" name="googleapps" /></td>
+ </tr>
+ <tr>
+ <td><label for="launchpad">Username:</label></td>
+ <td><input type="text" name="launchpad" /></td>
+ </tr>
+ <tr>
+ <td><label for="openid_url">OpenID URL:</label></td>
+ <td><input type="text" name="openid_url" /></td>
+ </tr>
+ </t>
+ </t>
+
+ <t t-extend="Login">
+ <t t-jquery=".oe_box2 tr:has(input[name!='db'])">
+ //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'));
+ });
+ </t>
+ </t>
+
+</templates>
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. (<http://openerp.com>).
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+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/l10n_ch/journal_data.xml b/addons/l10n_ch/journal_data.xml
index ac8c714fbca..c755660d950 100644
--- a/addons/l10n_ch/journal_data.xml
+++ b/addons/l10n_ch/journal_data.xml
@@ -6,7 +6,6 @@
<field name="code">EXPF</field>
<field name="type">purchase</field>
<field name="view_id" ref="account.account_journal_view"/>
- <field name="sequence_id" ref="account.sequence_journal"/>
<field name="user_id" ref="base.user_root"/>
<field name="update_posted" eval="True" />
<field name="entry_posted" eval="True" />
@@ -17,7 +16,6 @@
<field name="code">BCHF</field>
<field name="type">cash</field>
<field name="view_id" ref="account.account_journal_bank_view"/>
- <field name="sequence_id" ref="account.sequence_journal"/>
<field name="user_id" ref="base.user_root"/>
<field name="update_posted" eval="True" />
<field name="entry_posted" eval="True" />
@@ -28,7 +26,6 @@
<field name="code">BEUR</field>
<field name="type">cash</field>
<field name="view_id" ref="account.account_journal_bank_view"/>
- <field name="sequence_id" ref="account.sequence_journal"/>
<field name="user_id" ref="base.user_root"/>
<field name="update_posted" eval="True" />
<field name="entry_posted" eval="True" />
@@ -40,7 +37,6 @@
<field name="code">CAI</field>
<field name="type">cash</field>
<field name="view_id" ref="account.account_journal_bank_view"/>
- <field name="sequence_id" ref="account.sequence_journal"/>
<field name="user_id" ref="base.user_root"/>
<field name="update_posted" eval="True" />
<field name="entry_posted" eval="True" />
@@ -51,7 +47,6 @@
<field name="code">OD</field>
<field name="type">general</field>
<field name="view_id" ref="account.account_journal_bank_view"/>
- <field name="sequence_id" ref="account.sequence_journal"/>
<field name="user_id" ref="base.user_root"/>
<field name="update_posted" eval="True" />
<field name="entry_posted" eval="True" />
@@ -63,7 +58,6 @@
<field name="type">situation</field>
<field name="centralisation">True</field>
<field name="view_id" ref="account.account_journal_view"/>
- <field name="sequence_id" ref="account.sequence_journal"/>
<field name="update_posted" eval="True" />
</record>
diff --git a/addons/point_of_sale/wizard/pos_open_statement.py b/addons/point_of_sale/wizard/pos_open_statement.py
index 038ca3b6990..47c5348943b 100644
--- a/addons/point_of_sale/wizard/pos_open_statement.py
+++ b/addons/point_of_sale/wizard/pos_open_statement.py
@@ -53,9 +53,9 @@ class pos_open_statement(osv.osv_memory):
continue
if journal.sequence_id:
- number = sequence_obj.get_id(cr, uid, journal.sequence_id.id)
+ number = sequence_obj.next_by_id(cr, uid, journal.sequence_id.id)
else:
- number = sequence_obj.get(cr, uid, 'account.cash.statement')
+ number = sequence_obj.next_by_code(cr, uid, 'account.cash.statement')
data.update({
'journal_id': journal.id,
diff --git a/addons/sale/test/data_test.yml b/addons/sale/test/data_test.yml
index 7064a549335..0be8474754c 100644
--- a/addons/sale/test/data_test.yml
+++ b/addons/sale/test/data_test.yml
@@ -122,7 +122,6 @@
default_credit_account_id: account_account_purchases0
default_debit_account_id: account_account_purchases0
name: Purchase Journal - (test)
- sequence_id: account.sequence_purchase_journal
type: purchase
view_id: account.account_journal_view
-
@@ -134,7 +133,6 @@
default_credit_account_id: account_account_sales0
default_debit_account_id: account_account_sales0
name: Sale Journal
- sequence_id: account.sequence_sale_journal
type: sale
view_id: account.account_journal_view
-
@@ -146,7 +144,6 @@
default_credit_account_id: account_account_cash0
default_debit_account_id: account_account_cash0
name: Bank Journal
- sequence_id: account.sequence_journal
type: cash
view_id: account.account_journal_bank_view
-
diff --git a/addons/stock/stock_data.xml b/addons/stock/stock_data.xml
index bcde818c78a..c0c872e99f2 100644
--- a/addons/stock/stock_data.xml
+++ b/addons/stock/stock_data.xml
@@ -2,12 +2,17 @@
<openerp>
<data noupdate="1">
+ <record id="stock_journal_sequence" model="ir.sequence">
+ <field name="name">Stock Journal Sequence</field>
+ <field eval="3" name="padding"/>
+ <field name="prefix">STJ/%(year)s/</field>
+ </record>
<record forcecreate="1" id="stock_journal" model="account.journal">
<field name="name">Stock Journal</field>
<field name="code">STJ</field>
<field name="type">general</field>
<field name="view_id" ref="account.account_journal_view"/>
- <field name="sequence_id" ref="account.sequence_journal"/>
+ <field name="sequence_id" ref="stock_journal_sequence"/>
<field name="user_id" ref="base.user_root"/>
</record>
diff --git a/addons/web_livechat/LICENSE b/addons/web_livechat/LICENSE
index 27a1a4cf453..ff64be448e9 100644
--- a/addons/web_livechat/LICENSE
+++ b/addons/web_livechat/LICENSE
@@ -1,5 +1,5 @@
OpenERP, Open Source Management Solution
-Copyright © 2010 OpenERP SA (<http://openerp.com>).
+Copyright © 2010-2011 OpenERP SA (<http://openerp.com>).
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
diff --git a/addons/web_livechat/__openerp__.py b/addons/web_livechat/__openerp__.py
index cea342ef05e..85187aa492c 100644
--- a/addons/web_livechat/__openerp__.py
+++ b/addons/web_livechat/__openerp__.py
@@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
-# Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>).
+# Copyright (C) 2010-2011 OpenERP s.a. (<http://openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -20,7 +20,7 @@
##############################################################################
{
'name': 'Live Chat Support',
- 'version': '1.1',
+ 'version': '2.0',
'category': 'Tools',
'complexity': "easy",
'description': """
@@ -33,9 +33,14 @@ Add "Support" button in header from where you can access OpenERP Support.
'website': 'http://openerp.com',
'depends': ['base'],
'update_xml': [],
+ 'js' : [
+ 'static/src/js/web_livechat.js',
+ ],
+ 'css' : [
+ 'static/src/css/lc.css',
+ ],
'installable': True,
- 'active': True,
- 'web': True,
+ 'active': False,
'certificate': '0013762192410413',
- 'images': ['images/web_livechat_support.jpeg'],
+ 'images': ['static/src/img/web_livechat_support.jpeg'],
}
diff --git a/addons/web_livechat/publisher_warranty.py b/addons/web_livechat/publisher_warranty.py
index ab83bc58c32..132e78d013e 100644
--- a/addons/web_livechat/publisher_warranty.py
+++ b/addons/web_livechat/publisher_warranty.py
@@ -44,7 +44,7 @@ class publisher_warranty_contract(osv.osv):
@cache(skiparg=3)
def get_default_livechat_text(self, cr, uid):
- return '<a href="http://www.openerp.com/support-or-publisher-warranty-contract" target="_blank"><img src="/web_livechat/static/images/busy.png"/>Support</a>'
+ return '<a href="http://www.openerp.com/support-or-publisher-warranty-contract" target="_blank"><img src="/web_livechat/static/src/img/busy.png"/>Support</a>'
publisher_warranty_contract()
diff --git a/addons/web_livechat/web/static/css/lc.css b/addons/web_livechat/static/src/css/lc.css
index e6892857ddd..7f1876a2793 100644
--- a/addons/web_livechat/web/static/css/lc.css
+++ b/addons/web_livechat/static/src/css/lc.css
@@ -1,7 +1,7 @@
-#livechat_status a.online {
+.livechat span.online {
text-shadow: 0 0 0.2em #9a0404, 0 0 0.2em #9a0404, 0 0 0.2em #9a0404, 0 0 0.2em #9a0404;
}
-#livechat_status img {
+.livechat img {
vertical-align: middle;
margin-right: 0.5em;
}
diff --git a/addons/web_livechat/static/src/img/available.png b/addons/web_livechat/static/src/img/available.png
new file mode 100644
index 00000000000..e9eea88ae5f
--- /dev/null
+++ b/addons/web_livechat/static/src/img/available.png
Binary files differ
diff --git a/addons/web_livechat/static/src/img/away.png b/addons/web_livechat/static/src/img/away.png
new file mode 100644
index 00000000000..f0a0847059f
--- /dev/null
+++ b/addons/web_livechat/static/src/img/away.png
Binary files differ
diff --git a/addons/web_livechat/static/src/img/busy.png b/addons/web_livechat/static/src/img/busy.png
new file mode 100644
index 00000000000..ddb24377f0f
--- /dev/null
+++ b/addons/web_livechat/static/src/img/busy.png
Binary files differ
diff --git a/addons/web_livechat/static/src/js/web_livechat.js b/addons/web_livechat/static/src/js/web_livechat.js
new file mode 100644
index 00000000000..6fed859449c
--- /dev/null
+++ b/addons/web_livechat/static/src/js/web_livechat.js
@@ -0,0 +1,100 @@
+/*############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2011 OpenERP SA (<http://openerp.com>).
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+############################################################################*/
+
+var __lc_buttons = [];
+
+openerp.web_livechat = function (openerp) {
+
+var QWeb = openerp.web.qweb;
+QWeb.add_template('/web_livechat/static/src/xml/web_livechat.xml');
+
+
+// tracking code from LiveChat
+var license = '1035052',
+ params = '',
+ lang = 'en',
+ skill = '0';
+__lc_load = function (p) { if (typeof __lc_loaded != 'function')
+ if (p) { var d = document, l = d.createElement('script'), s =
+ d.getElementsByTagName('script')[0], a = unescape('%26'),
+ h = ('https:' == d.location.protocol ? 'https://' : 'http://'); l.type = 'text/javascript'; l.async = true;
+ l.src = h + 'gis' + p +'.livechatinc.com/gis.cgi?serverType=control'+a+'licenseID='+license+a+'jsonp=__lc_load';
+ if (!(typeof p['server'] !== 'string' || typeof __lc_serv === 'string')) {
+ l.src = h + (__lc_serv = p['server']) + '/licence/'+license+'/script.cgi?lang='+lang+a+'groups='+skill;
+ l.src += (params == '') ? '' : a+'params='+encodeURIComponent(encodeURIComponent(params)); s.parentNode.insertBefore(l, s);
+ } else setTimeout(__lc_load, 1000); if(typeof __lc_serv != 'string'){ s.parentNode.insertBefore(l, s);}
+ } else __lc_load(Math.ceil(Math.random()*5)); }
+__lc_load();
+
+
+
+openerp.web_livechat.Livechat = openerp.web.Widget.extend({
+ template: 'Header-LiveChat',
+
+ start: function() {
+ this._super();
+ if (!this.session)
+ return;
+ var self = this;
+ var pwc = new openerp.web.Model(self.session, "publisher_warranty.contract");
+ pwc.get_func('get_default_livechat_text')().then(function(text) {
+ self.$element.html(text);
+ self.do_update();
+ });
+
+ openerp.webclient.header.do_update.add_last(this.do_update);
+ },
+
+ do_update: function() {
+ var self = this;
+ if (!this.session) {
+ self.$element.remove();
+ return;
+ }
+
+ var lc_id = _.uniqueId('livechat_');
+ this.$element.attr('id', lc_id);
+
+ var pwc = new openerp.web.Model(self.session, "publisher_warranty.contract");
+
+ pwc.get_func('is_livechat_enable')().then(function(res) {
+ console.log('res', res);
+ if(!res) {
+ //return;
+ }
+
+ __lc_buttons.push({
+ elementId: lc_id, //'livechat_status',
+ language: 'en',
+ skill: '0',
+ type: 'text',
+ labels: {
+ online: '<img src="/web_livechat/static/src/img/available.png"/>Support',
+ offline: '<img src="/web_livechat/static/src/img/away.png"/>Support',
+ }
+ });
+ });
+ }
+});
+
+openerp.webclient.livechat = new openerp.web_livechat.Livechat(openerp.webclient);
+openerp.webclient.livechat.prependTo('div.header_corner');
+
+};
diff --git a/addons/web_livechat/static/src/xml/web_livechat.xml b/addons/web_livechat/static/src/xml/web_livechat.xml
new file mode 100644
index 00000000000..b5e2db515b0
--- /dev/null
+++ b/addons/web_livechat/static/src/xml/web_livechat.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vim:fdl=1:
+-->
+<templates id="template" xml:space="preserve">
+ <t t-name="Header-LiveChat">
+ <div class="livechat block logout"></div>
+ </t>
+</templates>
diff --git a/addons/web_livechat/web/__init__.py b/addons/web_livechat/web/__init__.py
deleted file mode 100644
index ec026b194f1..00000000000
--- a/addons/web_livechat/web/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-##############################################################################
-# This file is part of the "web-livechatinc-odoo" OpenERP module.
-# See LICENCE file at the root of the module folder.
-##############################################################################
-import editors
diff --git a/addons/web_livechat/web/editors.py b/addons/web_livechat/web/editors.py
deleted file mode 100644
index bb3dd3da354..00000000000
--- a/addons/web_livechat/web/editors.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2010-2011 OpenERP s.a. (<http://openerp.com>).
-#
-# 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 <http://www.gnu.org/licenses/>.
-#
-##############################################################################
-
-import openobject.templating
-
-class BaseTemplateEditor(openobject.templating.TemplateEditor):
- templates = ['/openobject/controllers/templates/base.mako']
-
- def edit(self, template, template_text):
- output = super(BaseTemplateEditor, self).edit(template, template_text)
-
- end_head = output.index('</head>')
-
- output = output[:end_head] + """
- <link rel="stylesheet" type="text/css" href="/web_livechat/static/css/lc.css"/>
- <%
- cp.session['livechat'] = rpc.RPCProxy('publisher_warranty.contract').is_livechat_enable()
- %>
- % if cp.session['livechat']:
-<script type="text/javascript">
-
- (function() {
- var lc_params = '';
- var lc_lang = 'en';
- var lc_skill = '0';
-
- var lc = document.createElement('script'); lc.type = 'text/javascript'; lc.async = true;
- var lc_src = ('https:' == document.location.protocol ? 'https://' : 'http://');
- lc_src += 'chat.livechatinc.net/licence/1035052/script.cgi?lang='+lc_lang+unescape('%26')+'groups='+lc_skill;
- lc_src += ((lc_params == '') ? '' : unescape('%26')+'params='+encodeURIComponent(encodeURIComponent(lc_params))); lc.src = lc_src;
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(lc, s);
- })();
-
-</script>
- % endif
- """ + output[end_head:]
-
- return output
-
-
-class HeaderTemplateEditor(openobject.templating.TemplateEditor):
- templates = ['/openerp/controllers/templates/header.mako']
-
-
- def edit(self, template, template_text):
- output = super(HeaderTemplateEditor, self).edit(template, template_text)
-
- PATTERN = '<div id="corner">'
- corner = output.index(PATTERN) + len(PATTERN)
-
-
- output = output[:corner] + """
- <p id="livechat_status" class="logout">
- ${ rpc.RPCProxy('publisher_warranty.contract').get_default_livechat_text() | n}
- </p>
- % if cp.session['livechat']:
-
- <script type="text/javascript">
- var __lc_buttons = __lc_buttons || [];
- __lc_buttons.push({
- elementId: 'livechat_status',
- language: 'en',
- skill: '0',
- type: 'text',
- labels: {
- online: '<img src="/web_livechat/static/images/available.png"/>Support',
- offline: '<img src="/web_livechat/static/images/away.png"/>Support'
- }
- });
- </script>
-
- % endif
- """ + output[corner:]
- return output
-
diff --git a/addons/web_uservoice/__openerp__.py b/addons/web_uservoice/__openerp__.py
index cc248e90da7..ebcc91e7e67 100644
--- a/addons/web_uservoice/__openerp__.py
+++ b/addons/web_uservoice/__openerp__.py
@@ -35,7 +35,6 @@ Invite OpenERP user feedback, powered by uservoice.
'data': [],
'installable': True,
'active': False,
- 'web': True,
'certificate': '0040452504963885',
'images': ['images/submit_an_idea.jpeg','images/web_uservoice_feedback.jpeg'],
}