Vo Minh Thu (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-server/trunk-ir-sequence-vmt into 
lp:openobject-server.

Requested reviews:
  OpenERP Core Team (openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-ir-sequence-vmt/+merge/77343
-- 
https://code.launchpad.net/~openerp-dev/openobject-server/trunk-ir-sequence-vmt/+merge/77343
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-server/trunk-ir-sequence-vmt.
=== modified file 'openerp/addons/base/i18n/af.po'
--- openerp/addons/base/i18n/af.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/af.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/am.po'
--- openerp/addons/base/i18n/am.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/am.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/ar.po'
--- openerp/addons/base/i18n/ar.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/ar.po	2011-09-28 15:24:26 +0000
@@ -5430,7 +5430,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/base.pot'
--- openerp/addons/base/i18n/base.pot	2011-01-11 11:23:16 +0000
+++ openerp/addons/base/i18n/base.pot	2011-09-28 15:24:26 +0000
@@ -5217,7 +5217,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/bg.po'
--- openerp/addons/base/i18n/bg.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/bg.po	2011-09-28 15:24:26 +0000
@@ -5572,7 +5572,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Брой на остъпката"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/bs.po'
--- openerp/addons/base/i18n/bs.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/bs.po	2011-09-28 15:24:26 +0000
@@ -5439,7 +5439,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/ca.po'
--- openerp/addons/base/i18n/ca.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/ca.po	2011-09-28 15:24:26 +0000
@@ -5709,7 +5709,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Omplenat del número"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/cs.po'
--- openerp/addons/base/i18n/cs.po	2011-09-17 04:54:38 +0000
+++ openerp/addons/base/i18n/cs.po	2011-09-28 15:24:26 +0000
@@ -5529,7 +5529,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Zarovnání čísla"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/da.po'
--- openerp/addons/base/i18n/da.po	2011-09-25 04:40:50 +0000
+++ openerp/addons/base/i18n/da.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/de.po'
--- openerp/addons/base/i18n/de.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/de.po	2011-09-28 15:24:26 +0000
@@ -5702,7 +5702,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Stellenanzahl"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/el.po'
--- openerp/addons/base/i18n/el.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/el.po	2011-09-28 15:24:26 +0000
@@ -5614,7 +5614,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Συμπλήρωση αριθμών"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/en_GB.po'
--- openerp/addons/base/i18n/en_GB.po	2011-09-23 04:38:33 +0000
+++ openerp/addons/base/i18n/en_GB.po	2011-09-28 15:24:26 +0000
@@ -5669,8 +5669,8 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
-msgstr "Number padding"
+msgid "Number Padding"
+msgstr "Number Padding"
 
 #. module: base
 #: view:ir.actions.report.xml:0

=== modified file 'openerp/addons/base/i18n/es.po'
--- openerp/addons/base/i18n/es.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/es.po	2011-09-28 15:24:26 +0000
@@ -5723,7 +5723,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Relleno del número"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/es_AR.po'
--- openerp/addons/base/i18n/es_AR.po	2010-10-12 05:27:02 +0000
+++ openerp/addons/base/i18n/es_AR.po	2011-09-28 15:24:26 +0000
@@ -4778,7 +4778,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Relleno del número"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/es_CL.po'
--- openerp/addons/base/i18n/es_CL.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/es_CL.po	2011-09-28 15:24:26 +0000
@@ -5725,7 +5725,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Relleno del número"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/es_EC.po'
--- openerp/addons/base/i18n/es_EC.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/es_EC.po	2011-09-28 15:24:26 +0000
@@ -5712,7 +5712,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Relleno del número"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/et.po'
--- openerp/addons/base/i18n/et.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/et.po	2011-09-28 15:24:26 +0000
@@ -5488,7 +5488,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Arvu täidistus"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/eu.po'
--- openerp/addons/base/i18n/eu.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/eu.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/fa.po'
--- openerp/addons/base/i18n/fa.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/fa.po	2011-09-28 15:24:26 +0000
@@ -5496,7 +5496,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "پیمایش شمارگانی"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/fa_AF.po'
--- openerp/addons/base/i18n/fa_AF.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/fa_AF.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/fi.po'
--- openerp/addons/base/i18n/fi.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/fi.po	2011-09-28 15:24:26 +0000
@@ -5664,7 +5664,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Täytenumerot"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/fr.po'
--- openerp/addons/base/i18n/fr.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/fr.po	2011-09-28 15:24:26 +0000
@@ -5717,7 +5717,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Remplissage"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/gl.po'
--- openerp/addons/base/i18n/gl.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/gl.po	2011-09-28 15:24:26 +0000
@@ -5695,7 +5695,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Número de enchido"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/he.po'
--- openerp/addons/base/i18n/he.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/he.po	2011-09-28 15:24:26 +0000
@@ -5472,7 +5472,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/hr.po'
--- openerp/addons/base/i18n/hr.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/hr.po	2011-09-28 15:24:26 +0000
@@ -5553,7 +5553,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Dopunjavanje na duljinu"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/hu.po'
--- openerp/addons/base/i18n/hu.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/hu.po	2011-09-28 15:24:26 +0000
@@ -5666,8 +5666,8 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
-msgstr "Number padding"
+msgid "Number Padding"
+msgstr "Number Padding"
 
 #. module: base
 #: view:ir.actions.report.xml:0

=== modified file 'openerp/addons/base/i18n/hy.po'
--- openerp/addons/base/i18n/hy.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/hy.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/id.po'
--- openerp/addons/base/i18n/id.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/id.po	2011-09-28 15:24:26 +0000
@@ -5435,7 +5435,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/is.po'
--- openerp/addons/base/i18n/is.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/is.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/it.po'
--- openerp/addons/base/i18n/it.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/it.po	2011-09-28 15:24:26 +0000
@@ -5713,7 +5713,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Riempimento Numero"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/ja.po'
--- openerp/addons/base/i18n/ja.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/ja.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/kk.po'
--- openerp/addons/base/i18n/kk.po	2011-09-17 04:54:38 +0000
+++ openerp/addons/base/i18n/kk.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/ko.po'
--- openerp/addons/base/i18n/ko.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/ko.po	2011-09-28 15:24:26 +0000
@@ -5457,7 +5457,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/lt.po'
--- openerp/addons/base/i18n/lt.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/lt.po	2011-09-28 15:24:26 +0000
@@ -5464,7 +5464,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/lt_LT.po'
--- openerp/addons/base/i18n/lt_LT.po	2010-10-12 05:27:02 +0000
+++ openerp/addons/base/i18n/lt_LT.po	2011-09-28 15:24:26 +0000
@@ -4618,7 +4618,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/lv.po'
--- openerp/addons/base/i18n/lv.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/lv.po	2011-09-28 15:24:26 +0000
@@ -5514,7 +5514,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Ciparu vietas"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/mk.po'
--- openerp/addons/base/i18n/mk.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/mk.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/mn.po'
--- openerp/addons/base/i18n/mn.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/mn.po	2011-09-28 15:24:26 +0000
@@ -5533,7 +5533,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Тоон дугаарын урт"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/nb.po'
--- openerp/addons/base/i18n/nb.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/nb.po	2011-09-28 15:24:26 +0000
@@ -5530,7 +5530,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Bunnfyll"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/nl.po'
--- openerp/addons/base/i18n/nl.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/nl.po	2011-09-28 15:24:26 +0000
@@ -5702,7 +5702,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Nummer verspringing"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/nl_BE.po'
--- openerp/addons/base/i18n/nl_BE.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/nl_BE.po	2011-09-28 15:24:26 +0000
@@ -5447,7 +5447,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/nl_NL.po'
--- openerp/addons/base/i18n/nl_NL.po	2010-10-12 05:27:02 +0000
+++ openerp/addons/base/i18n/nl_NL.po	2011-09-28 15:24:26 +0000
@@ -4796,7 +4796,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Nummer verspringing"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/pl.po'
--- openerp/addons/base/i18n/pl.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/pl.po	2011-09-28 15:24:26 +0000
@@ -5612,7 +5612,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Liczba cyfr"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/pt.po'
--- openerp/addons/base/i18n/pt.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/pt.po	2011-09-28 15:24:26 +0000
@@ -5591,7 +5591,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Dígitos do número"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/pt_BR.po'
--- openerp/addons/base/i18n/pt_BR.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/pt_BR.po	2011-09-28 15:24:26 +0000
@@ -5687,7 +5687,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Preencher número"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/ro.po'
--- openerp/addons/base/i18n/ro.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/ro.po	2011-09-28 15:24:26 +0000
@@ -5555,7 +5555,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/ru.po'
--- openerp/addons/base/i18n/ru.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/ru.po	2011-09-28 15:24:26 +0000
@@ -5689,7 +5689,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Выравнивание чисел"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/sk.po'
--- openerp/addons/base/i18n/sk.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/sk.po	2011-09-28 15:24:26 +0000
@@ -5598,7 +5598,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Zarovanie čísla"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/sl.po'
--- openerp/addons/base/i18n/sl.po	2011-09-27 04:47:23 +0000
+++ openerp/addons/base/i18n/sl.po	2011-09-28 15:24:26 +0000
@@ -5650,7 +5650,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Zapolnitev številke"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/sq.po'
--- openerp/addons/base/i18n/sq.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/sq.po	2011-09-28 15:24:26 +0000
@@ -5430,7 +5430,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/sr.po'
--- openerp/addons/base/i18n/sr.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/sr.po	2011-09-28 15:24:26 +0000
@@ -5575,7 +5575,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Dopunjavanje brojeva"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/[email protected]'
--- openerp/addons/base/i18n/[email protected]	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/[email protected]	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/sv.po'
--- openerp/addons/base/i18n/sv.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/sv.po	2011-09-28 15:24:26 +0000
@@ -5624,7 +5624,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Numerisk utfyllnad"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/th.po'
--- openerp/addons/base/i18n/th.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/th.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/tlh.po'
--- openerp/addons/base/i18n/tlh.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/tlh.po	2011-09-28 15:24:26 +0000
@@ -5430,7 +5430,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/tr.po'
--- openerp/addons/base/i18n/tr.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/tr.po	2011-09-28 15:24:26 +0000
@@ -5637,7 +5637,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Numara dolgusu"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/uk.po'
--- openerp/addons/base/i18n/uk.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/uk.po	2011-09-28 15:24:26 +0000
@@ -5495,7 +5495,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Вирівнювання номерів"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/uk_UA.po'
--- openerp/addons/base/i18n/uk_UA.po	2010-10-12 05:27:02 +0000
+++ openerp/addons/base/i18n/uk_UA.po	2011-09-28 15:24:26 +0000
@@ -4636,7 +4636,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "Вирівнювання номерів"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/ur.po'
--- openerp/addons/base/i18n/ur.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/ur.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/vi.po'
--- openerp/addons/base/i18n/vi.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/vi.po	2011-09-28 15:24:26 +0000
@@ -5468,7 +5468,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/zh_CN.po'
--- openerp/addons/base/i18n/zh_CN.po	2011-09-01 04:46:07 +0000
+++ openerp/addons/base/i18n/zh_CN.po	2011-09-28 15:24:26 +0000
@@ -5471,7 +5471,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr "数字位数"
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/zh_HK.po'
--- openerp/addons/base/i18n/zh_HK.po	2011-09-28 05:19:41 +0000
+++ openerp/addons/base/i18n/zh_HK.po	2011-09-28 15:24:26 +0000
@@ -5431,7 +5431,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/i18n/zh_TW.po'
--- openerp/addons/base/i18n/zh_TW.po	2011-09-28 05:19:41 +0000
+++ openerp/addons/base/i18n/zh_TW.po	2011-09-28 15:24:26 +0000
@@ -5447,7 +5447,7 @@
 
 #. module: base
 #: field:ir.sequence,padding:0
-msgid "Number padding"
+msgid "Number Padding"
 msgstr ""
 
 #. module: base

=== modified file 'openerp/addons/base/ir/ir.xml'
--- openerp/addons/base/ir/ir.xml	2011-09-21 08:30:41 +0000
+++ openerp/addons/base/ir/ir.xml	2011-09-28 15:24:26 +0000
@@ -176,6 +176,7 @@
                         <field name="padding"/>
                         <field name="number_increment"/>
                         <field name="number_next"/>
+                        <field name="implementation"/>
                         <separator colspan="4" string="Legend (for prefix, suffix)"/>
                         <group col="8" colspan="4">
                             <group>
@@ -215,6 +216,7 @@
                     <field name="company_id" groups="base.group_multi_company"/>
                     <field name="number_next"/>
                     <field name="number_increment"/>
+                    <field name="implementation"/>
                 </tree>
             </field>
         </record>

=== modified file 'openerp/addons/base/ir/ir_sequence.py'
--- openerp/addons/base/ir/ir_sequence.py	2011-07-04 07:00:20 +0000
+++ openerp/addons/base/ir/ir_sequence.py	2011-09-28 15:24:26 +0000
@@ -20,82 +20,236 @@
 ##############################################################################
 
 import time
-from osv import fields,osv
-import pooler
-
-class ir_sequence_type(osv.osv):
+
+import openerp
+
+class ir_sequence_type(openerp.osv.osv.osv):
     _name = 'ir.sequence.type'
     _order = 'name'
     _columns = {
-        'name': fields.char('Name',size=64, required=True),
-        'code': fields.char('Code',size=32, required=True),
+        'name': openerp.osv.fields.char('Name', size=64, required=True),
+        'code': openerp.osv.fields.char('Code', size=32, required=True),
     }
-ir_sequence_type()
+
+    _sql_constraints = [
+        ('code_unique', 'unique(code)', '`code` must be unique.'),
+    ]
 
 def _code_get(self, cr, uid, context={}):
     cr.execute('select code, name from ir_sequence_type')
     return cr.fetchall()
 
-class ir_sequence(osv.osv):
+IMPLEMENTATION_SELECTION = \
+    [('standard', 'Standard'), ('no_gap', 'No gap')]
+
+class ir_sequence(openerp.osv.osv.osv):
+    """ Sequence model.
+
+    The sequence model allows to define and use so-called sequence objects.
+    Such objects are used to generate unique identifiers in a transaction-safe
+    way.
+
+    """
     _name = 'ir.sequence'
     _order = 'name'
     _columns = {
-        'name': fields.char('Name',size=64, required=True),
-        'code': fields.selection(_code_get, 'Code',size=64, required=True),
-        'active': fields.boolean('Active'),
-        'prefix': fields.char('Prefix',size=64, help="Prefix value of the record for the sequence"),
-        'suffix': fields.char('Suffix',size=64, help="Suffix value of the record for the sequence"),
-        'number_next': fields.integer('Next Number', required=True, help="Next number of this sequence"),
-        'number_increment': fields.integer('Increment Number', required=True, help="The next number of the sequence will be incremented by this number"),
-        'padding' : fields.integer('Number padding', required=True, help="OpenERP will automatically adds some '0' on the left of the 'Next Number' to get the required padding size."),
-        'company_id': fields.many2one('res.company', 'Company'),
+        'name': openerp.osv.fields.char('Name', size=64, required=True),
+        'code': openerp.osv.fields.selection(_code_get, 'Code', size=64, required=True),
+        'implementation': openerp.osv.fields.selection( # TODO update the view
+            IMPLEMENTATION_SELECTION, 'Implementation', required=True,
+            help="Two sequence object implementations are offered: Standard "
+            "and 'No gap'. The later is slower than the former but forbids any"
+            " gap in the sequence (while they are possible in the former)."),
+        'active': openerp.osv.fields.boolean('Active'),
+        'prefix': openerp.osv.fields.char('Prefix', size=64, help="Prefix value of the record for the sequence"),
+        'suffix': openerp.osv.fields.char('Suffix', size=64, help="Suffix value of the record for the sequence"),
+        'number_next': openerp.osv.fields.integer('Next Number', required=True, help="Next number of this sequence"),
+        'number_increment': openerp.osv.fields.integer('Increment Number', required=True, help="The next number of the sequence will be incremented by this number"),
+        'padding' : openerp.osv.fields.integer('Number Padding', required=True, help="OpenERP will automatically adds some '0' on the left of the 'Next Number' to get the required padding size."),
+        'company_id': openerp.osv.fields.many2one('res.company', 'Company'),
     }
     _defaults = {
-        'active': lambda *a: True,
+        'implementation': 'standard',
+        'active': True,
         'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'ir.sequence', context=c),
-        'number_increment': lambda *a: 1,
-        'number_next': lambda *a: 1,
-        'padding' : lambda *a : 0,
+        'number_increment': 1,
+        'number_next': 1,
+        'padding' : 0,
     }
 
-    def _process(self, s):
-        return (s or '') % {
-            'year':time.strftime('%Y'),
-            'month': time.strftime('%m'),
-            'day':time.strftime('%d'),
-            'y': time.strftime('%y'),
-            'doy': time.strftime('%j'),
-            'woy': time.strftime('%W'),
-            'weekday': time.strftime('%w'),
-            'h24': time.strftime('%H'),
-            'h12': time.strftime('%I'),
-            'min': time.strftime('%M'),
-            'sec': time.strftime('%S'),
+    def create(self, cr, uid, values, context=None):
+        values = self._add_missing_default_values(cr, uid, values, context)
+        go = super(ir_sequence, self).create \
+            if values['implementation'] == 'no_gap' else self.create_postgres
+        return go(cr, uid, values, context)
+
+    def create_postgres(self, cr, uid, values, context=None):
+        """ Create a fast, gaps-allowed PostgreSQL sequence.
+
+        :param values: same argument than for ``create()`` but the keys
+            ``number_increment`` and ``number_next`` must be present.
+            ``_add_missing_default_values()`` can be used to this effect.
+        :return: id of the newly created record
+        """
+        id = super(ir_sequence, self).create(cr, uid, values, context)
+        self._create_sequence(cr, id,
+            values['number_increment'], values['number_next'])
+        return id
+
+    def unlink(self, cr, uid, ids, context=None):
+        super(ir_sequence, self).unlink(cr, uid, ids, context)
+        self._drop_sequence(cr, ids)
+        return True
+
+    def write(self, cr, uid, ids, values, context=None):
+        ids = ids if isinstance(ids, (list, tuple)) else [ids]
+        new_implementation = values.get('implementation')
+        rows = self.read(cr, uid, ids, ['implementation',
+            'number_increment', 'number_next'], context)
+        super(ir_sequence, self).write(cr, uid, ids, values, context)
+        
+        for row in rows:
+            # 4 cases: we test the previous impl. against the new one.
+            if row['implementation'] == 'standard':
+                i = values.get('number_increment', row['number_increment'])
+                n = values.get('number_next', row['number_next'])
+                if new_implementation in ('standard', None):
+                    self._alter_sequence(cr, row['id'], i, n)
+                else:
+                    self._drop_sequence(cr, row['id'])
+            else:
+                if new_implementation in ('no_gap', None):
+                    pass
+                else:
+                    self._create_sequence(cr, row['id'], i, n)
+
+        return True
+
+    def _interpolate(self, s, d):
+        return s % d if s else ''
+
+    def _interpolation_dict(self):
+        t = time.localtime() # Actually, the server is always in UTC.
+        return {
+            'year': time.strftime('%Y', t),
+            'month': time.strftime('%m', t),
+            'day': time.strftime('%d', t),
+            'y': time.strftime('%y', t),
+            'doy': time.strftime('%j', t),
+            'woy': time.strftime('%W', t),
+            'weekday': time.strftime('%w', t),
+            'h24': time.strftime('%H', t),
+            'h12': time.strftime('%I', t),
+            'min': time.strftime('%M', t),
+            'sec': time.strftime('%S', t),
         }
 
-    def get_id(self, cr, uid, sequence_id, test='id', context=None):
-        assert test in ('code','id')
-        company_ids = self.pool.get('res.company').search(cr, uid, [], context=context)
-        cr.execute('''SELECT id, number_next, prefix, suffix, padding
-                      FROM ir_sequence
-                      WHERE %s=%%s
-                       AND active=true
-                       AND (company_id in %%s or company_id is NULL)
-                      ORDER BY company_id, id
-                      FOR UPDATE NOWAIT''' % test,
-                      (sequence_id, tuple(company_ids)))
-        res = cr.dictfetchone()
-        if res:
-            cr.execute('UPDATE ir_sequence SET number_next=number_next+number_increment WHERE id=%s AND active=true', (res['id'],))
-            if res['number_next']:
-                return self._process(res['prefix']) + '%%0%sd' % res['padding'] % res['number_next'] + self._process(res['suffix'])
-            else:
-                return self._process(res['prefix']) + self._process(res['suffix'])
-        return False
-
-    def get(self, cr, uid, code):
-        return self.get_id(cr, uid, code, test='code')
-ir_sequence()
+    # TODO rename 'test' to 'code_or_id' in account/sequence.
+    def get_id(self, cr, uid, sequence_code_or_id, code_or_id='id', context=None):
+        """ Draw an interpolated string using the specified sequence.
+
+        The sequence to use is specified by the ``sequence_code_or_id``
+        argument, which can be a code or an id (as controlled by the
+        ``code_or_id`` argument.
+        """
+        self.check_read(cr, uid)
+        res = self._select_by_code_or_id(cr, uid, sequence_code_or_id,
+            code_or_id, False, context)
+
+        if not res:
+            return False
+
+        if res['implementation'] == 'standard':
+            cr.execute("""
+                SELECT nextval('ir_sequence_%03d')
+                """ % res['id'])
+            res['number_next'] = cr.fetchone()
+        else:
+            # Read again with FOR UPDATE NO WAIT.
+            res = self._select_by_code_or_id(cr, uid, sequence_code_or_id,
+                code_or_id, True, context)
+            cr.execute("""
+                UPDATE ir_sequence
+                SET number_next=number_next+number_increment
+                WHERE id=%s
+                """, (res['id'],))
+
+        d = self._interpolation_dict()
+        interpolated_prefix = self._interpolate(res['prefix'], d)
+        interpolated_suffix = self._interpolate(res['suffix'], d)
+        if res['number_next']:
+            return interpolated_prefix + '%%0%sd' % res['padding'] % \
+                res['number_next'] + interpolated_suffix
+        else:
+            # TODO what is this case used for ?
+            return interpolated_prefix + interpolated_suffix
+
+    def get(self, cr, uid, code, context=None):
+        """ Draw an interpolated string using the specified sequence.
+
+        The sequence to use is specified by its code.
+        """
+        return self.get_id(cr, uid, code, 'code', context)
+
+    def _select_by_code_or_id(self, cr, uid, sequence_code_or_id, code_or_id,
+            for_update_no_wait, context=None):
+        """ Read a sequence object.
+
+        There is no access rights check on the sequence itself.
+        """
+        assert code_or_id in ('code', 'id')
+        res_company = self.pool.get('res.company')
+        company_ids = res_company.search(cr, uid, [], context=context)
+        funw = 'FOR UPDATE NOWAIT' if for_update_no_wait else ''
+        cr.execute("""
+            SELECT id, number_next, prefix, suffix, padding, implementation
+            FROM ir_sequence
+            WHERE %s=%%s
+              AND active=true
+              AND (company_id in %%s or company_id is NULL)
+            ORDER BY company_id, id
+            LIMIT 1
+            %s
+            """ % (code_or_id, funw),
+            (sequence_code_or_id, tuple(company_ids)))
+        return cr.dictfetchone()
+
+    def _create_sequence(self, cr, id, number_increment, number_next):
+        """ Create a PostreSQL sequence.
+
+        There is no access rights check.
+        """
+        assert isinstance(id, (int, long))
+        cr.execute("""
+            CREATE SEQUENCE ir_sequence_%03d INCREMENT BY %%s START WITH %%s
+            """ % id, (number_increment, number_next))
+
+    def _drop_sequence(self, cr, ids):
+        """ Drop the PostreSQL sequence if it exists.
+
+        There is no access rights check.
+        """
+
+        ids = ids if isinstance(ids, (list, tuple)) else [ids]
+        assert all(isinstance(i, (int, long)) for i in ids), \
+            "Only ids in (int, long) allowed."
+        names = ','.join('ir_sequence_%03d' % i for i in ids)
+
+        # RESTRICT is the default; it prevents dropping the sequence if an
+        # object depends on it.
+        cr.execute("""
+            DROP SEQUENCE IF EXISTS %s RESTRICT
+            """ % names)
+
+    def _alter_sequence(self, cr, id, number_increment, number_next):
+        """ Alter a PostreSQL sequence.
+
+        There is no access rights check.
+        """
+        assert isinstance(id, (int, long))
+        cr.execute("""
+            ALTER SEQUENCE ir_sequence_%03d INCREMENT BY %%s RESTART WITH %%s
+            """ % id, (number_increment, number_next))
 
 
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

=== added file 'tests/common.py'
--- tests/common.py	1970-01-01 00:00:00 +0000
+++ tests/common.py	2011-09-28 15:24:26 +0000
@@ -0,0 +1,47 @@
+# -*- coding: utf-8 -*-
+import os
+import time
+import unittest2
+import xmlrpclib
+
+import openerp
+
+ADDONS_PATH = os.environ['OPENERP_ADDONS_PATH']
+PORT = int(os.environ['OPENERP_PORT'])
+DB = os.environ['OPENERP_DATABASE']
+
+HOST = '127.0.0.1'
+
+ADMIN_USER = 'admin'
+ADMIN_USER_ID = 1
+ADMIN_PASSWORD = 'admin'
+
+common_proxy_60 = None
+db_proxy_60 = None
+object_proxy_60 = None
+
+def setUpModule():
+    """
+    Start the OpenERP server similary to the openerp-server script and
+    setup some xmlrpclib proxies.
+    """
+    openerp.tools.config['addons_path'] = ADDONS_PATH
+    openerp.tools.config['xmlrpc_port'] = PORT
+    openerp.service.start_services()
+
+    global common_proxy_60
+    global db_proxy_60
+    global object_proxy_60
+
+    # Use the old (pre 6.1) API.
+    url = 'http://%s:%d/xmlrpc/' % (HOST, PORT)
+    common_proxy_60 = xmlrpclib.ServerProxy(url + 'common')
+    db_proxy_60 = xmlrpclib.ServerProxy(url + 'db')
+    object_proxy_60 = xmlrpclib.ServerProxy(url + 'object')
+
+    # Ugly way to ensure the server is listening.
+    time.sleep(2)
+
+def tearDownModule():
+    """ Shutdown the OpenERP server similarly to a single ctrl-c. """
+    openerp.service.stop_services()

=== added file 'tests/test_ir_sequence.py'
--- tests/test_ir_sequence.py	1970-01-01 00:00:00 +0000
+++ tests/test_ir_sequence.py	2011-09-28 15:24:26 +0000
@@ -0,0 +1,198 @@
+# -*- coding: utf-8 -*-
+# Run with one of these commands:
+#    > OPENERP_ADDONS_PATH='../../addons/trunk' OPENERP_PORT=8069 \
+#      OPENERP_DATABASE=yy PYTHONPATH=. python tests/test_ir_sequence.py
+#    > OPENERP_ADDONS_PATH='../../addons/trunk' OPENERP_PORT=8069 \
+#      OPENERP_DATABASE=yy nosetests tests/test_ir_sequence.py
+#    > OPENERP_ADDONS_PATH='../../../addons/trunk' OPENERP_PORT=8069 \
+#      OPENERP_DATABASE=yy PYTHONPATH=../:. unit2 test_ir_sequence
+# This assume an existing database.
+import os
+import psycopg2
+import time
+import unittest2
+import xmlrpclib
+
+import openerp
+import common
+
+DB = common.DB
+ADMIN_USER_ID = common.ADMIN_USER_ID
+
+setUpModule = common.setUpModule
+tearDownModule = common.tearDownModule
+
+def registry(model):
+    return openerp.modules.registry.RegistryManager.get(DB)[model]
+
+def cursor():
+    return openerp.modules.registry.RegistryManager.get(DB).db.cursor()
+
+class test_ir_sequence_standard(unittest2.TestCase):
+    """ A few tests for a 'Standard' (i.e. PostgreSQL) sequence. """
+
+    def test_ir_sequence_create(self):
+        """ Try to create a sequence object. """
+        cr = cursor()
+        d = dict(code='test_sequence_type', name='Test sequence type')
+        c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        d = dict(code='test_sequence_type', name='Test sequence')
+        c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        cr.commit()
+        cr.close()
+
+    def test_ir_sequence_search(self):
+        """ Try a search. """
+        cr = cursor()
+        ids = registry('ir.sequence').search(cr, ADMIN_USER_ID, [], {})
+        assert ids
+        cr.commit()
+        cr.close()
+
+    def test_ir_sequence_draw(self):
+        """ Try to draw a number. """
+        cr = cursor()
+        n = registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type', {})
+        assert n
+        cr.commit()
+        cr.close()
+
+    def test_ir_sequence_draw_twice(self):
+        """ Try to draw a number from two transactions. """
+        cr0 = cursor()
+        cr1 = cursor()
+        n0 = registry('ir.sequence').get(cr0, ADMIN_USER_ID, 'test_sequence_type', {})
+        assert n0
+        n1 = registry('ir.sequence').get(cr1, ADMIN_USER_ID, 'test_sequence_type', {})
+        assert n1
+        cr0.commit()
+        cr1.commit()
+        cr0.close()
+        cr1.close()
+
+class test_ir_sequence_no_gap(unittest2.TestCase):
+    """ Copy of the previous tests for a 'No gap' sequence. """
+
+    def test_ir_sequence_create_no_gap(self):
+        """ Try to create a sequence object. """
+        cr = cursor()
+        d = dict(code='test_sequence_type_2', name='Test sequence type')
+        c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        d = dict(code='test_sequence_type_2', name='Test sequence',
+            implementation='no_gap')
+        c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        cr.commit()
+        cr.close()
+
+    def test_ir_sequence_draw_no_gap(self):
+        """ Try to draw a number. """
+        cr = cursor()
+        n = registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type_2', {})
+        assert n
+        cr.commit()
+        cr.close()
+
+    def test_ir_sequence_draw_twice_no_gap(self):
+        """ Try to draw a number from two transactions.
+        This is expected to not work.
+        """
+        cr0 = cursor()
+        cr1 = cursor()
+        msg_re = '^could not obtain lock on row in relation "ir_sequence"$'
+        with self.assertRaisesRegexp(psycopg2.OperationalError, msg_re):
+            n0 = registry('ir.sequence').get(cr0, ADMIN_USER_ID, 'test_sequence_type_2', {})
+            assert n0
+            n1 = registry('ir.sequence').get(cr1, ADMIN_USER_ID, 'test_sequence_type_2', {})
+        cr0.close()
+        cr1.close()
+
+class test_ir_sequence_change_implementation(unittest2.TestCase):
+    """ Create sequence objects and change their ``implementation`` field. """
+
+    def test_ir_sequence_1_create(self):
+        """ Try to create a sequence object. """
+        cr = cursor()
+        d = dict(code='test_sequence_type_3', name='Test sequence type')
+        c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        d = dict(code='test_sequence_type_3', name='Test sequence')
+        c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        d = dict(code='test_sequence_type_4', name='Test sequence type')
+        c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        d = dict(code='test_sequence_type_4', name='Test sequence',
+            implementation='no_gap')
+        c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        cr.commit()
+        cr.close()
+
+    def test_ir_sequence_2_write(self):
+        cr = cursor()
+        ids = registry('ir.sequence').search(cr, ADMIN_USER_ID,
+            [('code', 'in', ['test_sequence_type_3', 'test_sequence_type_4'])], {})
+        registry('ir.sequence').write(cr, ADMIN_USER_ID, ids,
+            {'implementation': 'standard'}, {})
+        registry('ir.sequence').write(cr, ADMIN_USER_ID, ids,
+            {'implementation': 'no_gap'}, {})
+        cr.commit()
+        cr.close()
+
+    def test_ir_sequence_3_unlink(self):
+        cr = cursor()
+        ids = registry('ir.sequence').search(cr, ADMIN_USER_ID,
+            [('code', 'in', ['test_sequence_type_3', 'test_sequence_type_4'])], {})
+        registry('ir.sequence').unlink(cr, ADMIN_USER_ID, ids, {})
+        cr.commit()
+        cr.close()
+
+class test_ir_sequence_generate(unittest2.TestCase):
+    """ Create sequence objects and generate some values. """
+
+    def test_ir_sequence_create(self):
+        """ Try to create a sequence object. """
+        cr = cursor()
+        d = dict(code='test_sequence_type_5', name='Test sequence type')
+        c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        d = dict(code='test_sequence_type_5', name='Test sequence')
+        c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        cr.commit()
+        cr.close()
+
+        cr = cursor()
+        f = lambda *a: registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type_5', {})
+        assert all(str(x) == f() for x in xrange(1,1000))
+        cr.commit()
+        cr.close()
+
+    def test_ir_sequence_create_no_gap(self):
+        """ Try to create a sequence object. """
+        cr = cursor()
+        d = dict(code='test_sequence_type_6', name='Test sequence type',
+            implementation='no_gap')
+        c = registry('ir.sequence.type').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        d = dict(code='test_sequence_type_6', name='Test sequence')
+        c = registry('ir.sequence').create(cr, ADMIN_USER_ID, d, {})
+        assert c
+        cr.commit()
+        cr.close()
+
+        cr = cursor()
+        f = lambda *a: registry('ir.sequence').get(cr, ADMIN_USER_ID, 'test_sequence_type_6', {})
+        assert all(str(x) == f() for x in xrange(1,1000))
+        cr.commit()
+        cr.close()
+        
+
+
+if __name__ == '__main__':
+    unittest2.main()
+

=== modified file 'tests/test_xmlrpc.py'
--- tests/test_xmlrpc.py	2011-09-23 13:34:08 +0000
+++ tests/test_xmlrpc.py	2011-09-28 15:24:26 +0000
@@ -12,43 +12,15 @@
 import xmlrpclib
 
 import openerp
-
-ADDONS_PATH = os.environ['OPENERP_ADDONS_PATH']
-PORT = int(os.environ['OPENERP_PORT'])
-DB = os.environ['OPENERP_DATABASE']
-
-HOST = '127.0.0.1'
-
-ADMIN_USER = 'admin'
-ADMIN_USER_ID = 1
-ADMIN_PASSWORD = 'admin'
-
-common_proxy_60 = None
-db_proxy_60 = None
-object_proxy_60 = None
-
-def setUpModule():
-    """
-    Start the OpenERP server similary to the openerp-server script and
-    setup some xmlrpclib proxies.
-    """
-    openerp.tools.config['addons_path'] = ADDONS_PATH
-    openerp.tools.config['xmlrpc_port'] = PORT
-    openerp.service.start_services()
-
-    global common_proxy_60
-    global db_proxy_60
-    global object_proxy_60
-
-    # Use the old (pre 6.1) API.
-    url = 'http://%s:%d/xmlrpc/' % (HOST, PORT)
-    common_proxy_60 = xmlrpclib.ServerProxy(url + 'common')
-    db_proxy_60 = xmlrpclib.ServerProxy(url + 'db')
-    object_proxy_60 = xmlrpclib.ServerProxy(url + 'object')
-
-def tearDownModule():
-    """ Shutdown the OpenERP server similarly to a single ctrl-c. """
-    openerp.service.stop_services()
+import common
+
+DB = common.DB
+ADMIN_USER = common.ADMIN_USER
+ADMIN_USER_ID = common.ADMIN_USER_ID
+ADMIN_PASSWORD = common.ADMIN_PASSWORD
+
+setUpModule = common.setUpModule
+tearDownModule = common.tearDownModule
 
 class test_xmlrpc(unittest2.TestCase):
 
@@ -57,26 +29,26 @@
         Simulate a OpenERP client requesting the creation of a database and
         polling the server until the creation is complete.
         """
-        progress_id = db_proxy_60.create(ADMIN_PASSWORD, DB, True, False,
-            ADMIN_PASSWORD)
+        progress_id = common.db_proxy_60.create(ADMIN_PASSWORD, DB, True,
+            False, ADMIN_PASSWORD)
         while True:
             time.sleep(1)
-            progress, users = db_proxy_60.get_progress(ADMIN_PASSWORD,
+            progress, users = common.db_proxy_60.get_progress(ADMIN_PASSWORD,
                 progress_id)
             if progress == 1.0:
                 break
 
     def test_xmlrpc_login(self):
         """ Try to login on the common service. """
-        uid = common_proxy_60.login(DB, ADMIN_USER, ADMIN_PASSWORD)
+        uid = common.common_proxy_60.login(DB, ADMIN_USER, ADMIN_PASSWORD)
         assert uid == ADMIN_USER_ID
 
     def test_xmlrpc_ir_model_search(self):
         """ Try a search on the object service. """
-        ids = object_proxy_60.execute(DB, ADMIN_USER_ID, ADMIN_PASSWORD,
+        ids = common.object_proxy_60.execute(DB, ADMIN_USER_ID, ADMIN_PASSWORD,
             'ir.model', 'search', [])
         assert ids
-        ids = object_proxy_60.execute(DB, ADMIN_USER_ID, ADMIN_PASSWORD,
+        ids = common.object_proxy_60.execute(DB, ADMIN_USER_ID, ADMIN_PASSWORD,
             'ir.model', 'search', [], {})
         assert ids
 

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to