summaryrefslogtreecommitdiff
path: root/bin/addons/base/ir/ir_sequence.py
diff options
context:
space:
mode:
authorpinky <>2006-12-07 13:41:40 +0000
committerpinky <>2006-12-07 13:41:40 +0000
commit004a0b996ff8f269451e07346f71a129a1f3fbaf (patch)
tree48f43c1fc2ca4c1f4d5648e7e73553d3f4ccae06 /bin/addons/base/ir/ir_sequence.py
New trunk
bzr revid: pinky-3f10ee12cea3c4c75cef44ab04ad33ef47432907
Diffstat (limited to 'bin/addons/base/ir/ir_sequence.py')
-rw-r--r--bin/addons/base/ir/ir_sequence.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/bin/addons/base/ir/ir_sequence.py b/bin/addons/base/ir/ir_sequence.py
new file mode 100644
index 00000000000..7b8ef925820
--- /dev/null
+++ b/bin/addons/base/ir/ir_sequence.py
@@ -0,0 +1,93 @@
+##############################################################################
+#
+# Copyright (c) 2004-2006 TINY SPRL. (http://tiny.be) All Rights Reserved.
+# Fabien Pinckaers <fp@tiny.Be>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+import threading
+import time
+from osv import fields,osv
+
+class ir_sequence_type(osv.osv):
+ _name = 'ir.sequence.type'
+ _columns = {
+ 'name': fields.char('Sequence Name',size=64, required=True),
+ 'code': fields.char('Sequence Code',size=32, required=True),
+ }
+ir_sequence_type()
+
+def _code_get(self, cr, uid, context={}):
+ cr.execute('select code, name from ir_sequence_type')
+ return cr.fetchall()
+
+class ir_sequence(osv.osv):
+ _name = 'ir.sequence'
+ _columns = {
+ 'name': fields.char('Sequence Name',size=64, required=True),
+ 'code': fields.selection(_code_get, 'Sequence Code',size=64, required=True),
+ 'active': fields.boolean('Active'),
+ 'prefix': fields.char('Prefix',size=64),
+ 'suffix': fields.char('Suffix',size=64),
+ 'number_next': fields.integer('Next Number', required=True),
+ 'number_increment': fields.integer('Increment Number', required=True),
+ 'padding' : fields.integer('Number padding', required=True),
+ }
+ _defaults = {
+ 'active': lambda *a: True,
+ 'number_increment': lambda *a: 1,
+ 'number_next': lambda *a: 1,
+ 'padding' : lambda *a : 0,
+ }
+
+ sequence_semaphore = threading.Semaphore()
+
+ def _process(self, s):
+ return (s or '') % {'year':time.strftime('%Y'), 'month': time.strftime('%m'), 'day':time.strftime('%d')}
+
+ def get_id(self, cr, uid, sequence_id, test='id=%d'):
+ self.sequence_semaphore.acquire()
+ cr.execute('select id,number_next,number_increment,prefix,suffix,padding from ir_sequence where '+test+' and active=True', (sequence_id,))
+ res = cr.dictfetchone()
+ if res:
+ cr.execute('update ir_sequence set number_next=number_next+number_increment where id=%d and active=True', (res['id'],))
+ self.sequence_semaphore.release()
+ 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'])
+ else:
+ self.sequence_semaphore.release()
+ return False
+
+ def get(self, cr, uid, code):
+ return self.get_id(cr, uid, code, test='code=%s')
+
+ def set(self, cr, uid, code, next_number):
+ self.sequence_semaphore.acquire()
+ cr.execute('update ir_sequence set number_next=%d where code=%s and active=True', (next_number, code,))
+ self.sequence_semaphore.release()
+ return True
+ir_sequence()
+