diff options
| author | HDA (OpenERP) <hda@tinyerp.com> | 2009-10-21 12:54:49 +0530 |
|---|---|---|
| committer | HDA (OpenERP) <hda@tinyerp.com> | 2009-10-21 12:54:49 +0530 |
| commit | b7f6bc4c8e2996b7ffdb881835ccb0b9d4f556d1 (patch) | |
| tree | 162d1210beee282ca0837cfd9ed90a0edd29fdd9 /addons | |
| parent | 251b6720cac31cc62b1e09544c317757fd274ef4 (diff) | |
Remove sql injection problem
lp bug: https://launchpad.net/bugs/429327 fixed
bzr revid: hda@tinyerp.com-20091021072449-rc9usc422tb0kv2f
Diffstat (limited to 'addons')
46 files changed, 2027 insertions, 1960 deletions
diff --git a/addons/account/account.py b/addons/account/account.py index 9c6a45da129..de837e2ea06 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -729,7 +729,7 @@ class account_move(osv.osv): def _amount_compute(self, cr, uid, ids, name, args, context, where =''): if not ids: return {} - cr.execute('select move_id,sum(debit) from account_move_line where move_id in ('+','.join(map(str,ids))+') group by move_id') + cr.execute('select move_id,sum(debit) from account_move_line where move_id in ('+','.join(map(str,map(int, ids)))+') group by move_id') result = dict(cr.fetchall()) for id in ids: result.setdefault(id, 0.0) @@ -807,7 +807,7 @@ class account_move(osv.osv): if new_name: self.write(cr, uid, [move.id], {'name':new_name}) - cr.execute('update account_move set state=%s where id in ('+','.join(map(str,ids))+')', ('posted',)) + cr.execute('update account_move set state=%s where id in ('+','.join(map(str, ids))+')', ('posted',)) else: raise osv.except_osv(_('Integrity Error !'), _('You can not validate a non-balanced entry !')) return True @@ -820,7 +820,7 @@ class account_move(osv.osv): if not line.journal_id.update_posted: raise osv.except_osv(_('Error !'), _('You can not modify a posted entry of this journal !\nYou should set the journal to allow cancelling entries if you want to do that.')) if len(ids): - cr.execute('update account_move set state=%s where id in ('+','.join(map(str,ids))+')', ('draft',)) + cr.execute('update account_move set state=%s where id in ('+','.join(map(str, ids))+')', ('draft',)) return True def write(self, cr, uid, ids, vals, context={}): @@ -1177,7 +1177,7 @@ class account_tax_code(osv.osv): def _check_recursion(self, cr, uid, ids): level = 100 while len(ids): - cr.execute('select distinct parent_id from account_tax_code where id in ('+','.join(map(str,ids))+')') + cr.execute('select distinct parent_id from account_tax_code where id in ('+','.join(map(str, ids))+')') ids = filter(None, map(lambda x:x[0], cr.fetchall())) if not level: return False @@ -1797,7 +1797,7 @@ class account_account_template(osv.osv): def _check_recursion(self, cr, uid, ids): level = 100 while len(ids): - cr.execute('select parent_id from account_account_template where id in ('+','.join(map(str,ids))+')') + cr.execute('select parent_id from account_account_template where id in ('+','.join(map(str, ids))+')') ids = filter(None, map(lambda x:x[0], cr.fetchall())) if not level: return False @@ -1856,7 +1856,7 @@ class account_tax_code_template(osv.osv): def _check_recursion(self, cr, uid, ids): level = 100 while len(ids): - cr.execute('select distinct parent_id from account_tax_code_template where id in ('+','.join(map(str,ids))+')') + cr.execute('select distinct parent_id from account_tax_code_template where id in ('+','.join(map(str, ids))+')') ids = filter(None, map(lambda x:x[0], cr.fetchall())) if not level: return False diff --git a/addons/account/invoice.py b/addons/account/invoice.py index 7981f0fe3d2..e0b2a3cf863 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -397,7 +397,7 @@ class account_invoice(osv.osv): l.id \ from account_move_line l \ left join account_invoice i on (i.move_id=l.move_id) \ - where i.id in ('+','.join(map(str,ids))+') and l.account_id=i.account_id') + where i.id in ('+','.join(map(str,map(int, ids)))+') and l.account_id=i.account_id') res = map(lambda x: x[0], cr.fetchall()) return res @@ -680,7 +680,7 @@ class account_invoice(osv.osv): def action_number(self, cr, uid, ids, *args): cr.execute('SELECT id, type, number, move_id, reference ' \ 'FROM account_invoice ' \ - 'WHERE id IN ('+','.join(map(str,ids))+')') + 'WHERE id IN ('+','.join(map(str, ids))+')') obj_inv = self.browse(cr, uid, ids)[0] for (id, invtype, number, move_id, reference) in cr.fetchall(): if not number: diff --git a/addons/account/report/partner_balance.py b/addons/account/report/partner_balance.py index fd1fdd8fd80..02d8540e0b4 100755 --- a/addons/account/report/partner_balance.py +++ b/addons/account/report/partner_balance.py @@ -166,7 +166,7 @@ class partner_balance(report_sxw.rml_parse): ## self.date_lst_string ='' if self.date_lst: - self.date_lst_string = '\'' + '\',\''.join(map(str,self.date_lst)) + '\'' + self.date_lst_string = '\'' + '\',\''.join(map(str, self.date_lst)) + '\'' ## Compute Code diff --git a/addons/account/report/third_party_ledger.py b/addons/account/report/third_party_ledger.py index e3586e3f85d..7a64a6b52fe 100644 --- a/addons/account/report/third_party_ledger.py +++ b/addons/account/report/third_party_ledger.py @@ -162,7 +162,7 @@ class third_party_ledger(rml_parse.rml_parse): self.date_lst_string = '' if self.date_lst: - self.date_lst_string = '\'' + '\',\''.join(map(str,self.date_lst)) + '\'' + self.date_lst_string = '\'' + '\',\''.join(map(str, self.date_lst)) + '\'' # #new_ids = [id for (id,) in self.cr.fetchall()] if data['form']['result_selection'] == 'supplier': diff --git a/addons/account/wizard/wizard_open_closed_fiscalyear.py b/addons/account/wizard/wizard_open_closed_fiscalyear.py index ea2be932822..91201d9f85e 100644 --- a/addons/account/wizard/wizard_open_closed_fiscalyear.py +++ b/addons/account/wizard/wizard_open_closed_fiscalyear.py @@ -43,7 +43,7 @@ def _remove_entries(self, cr, uid, data, context): period_journal = data_fyear.end_journal_period_id ids_move = pool.get('account.move').search(cr,uid,[('journal_id','=',period_journal.journal_id.id),('period_id','=',period_journal.period_id.id)]) if ids_move: - cr.execute('delete from account_move where id in ('+','.join(map(str,ids_move))+')') + cr.execute('delete from account_move where id in ('+','.join(map(str, ids_move))+')') #cr.execute('UPDATE account_journal_period ' \ # 'SET state = %s ' \ # 'WHERE period_id IN (SELECT id FROM account_period WHERE fiscalyear_id = %s)', diff --git a/addons/account_payment/account_move_line.py b/addons/account_payment/account_move_line.py index d7965179b94..febaf80d8da 100644 --- a/addons/account_payment/account_move_line.py +++ b/addons/account_payment/account_move_line.py @@ -42,7 +42,7 @@ class account_move_line(osv.osv): WHERE move_line_id = ml.id AND po.state != 'cancel') as amount FROM account_move_line ml - WHERE id in (%s)""" % (",".join(map(str, ids)))) + WHERE id in (%s)""" % (",".join(map(str,map(int, ids))))) r=dict(cr.fetchall()) return r diff --git a/addons/account_payment/payment.py b/addons/account_payment/payment.py index c8874b9bca0..1b3392564bf 100644 --- a/addons/account_payment/payment.py +++ b/addons/account_payment/payment.py @@ -225,7 +225,7 @@ class payment_line(osv.osv): inner join payment_line pl on (ml.id = pl.move_line_id) where pl.id in (%s)"""% - (self.translate(name), ','.join(map(str,ids))) ) + (self.translate(name), ','.join(map(str, ids)))) res = dict(cr.fetchall()) if name == 'partner_id': diff --git a/addons/account_voucher/voucher.py b/addons/account_voucher/voucher.py index 2f24f0ad108..c3cfd7c9d73 100755 --- a/addons/account_voucher/voucher.py +++ b/addons/account_voucher/voucher.py @@ -404,7 +404,7 @@ class account_voucher(osv.osv): def action_number(self, cr, uid, ids, *args): cr.execute('SELECT id, type, number, move_id, reference ' \ 'FROM account_voucher ' \ - 'WHERE id IN ('+','.join(map(str,ids))+')') + 'WHERE id IN ('+','.join(map(str, ids))+')') for (id, invtype, number, move_id, reference) in cr.fetchall(): if not number: number = self.pool.get('ir.sequence').get(cr, uid, invtype) diff --git a/addons/analytic_journal_billing_rate/__terp__.py b/addons/analytic_journal_billing_rate/__terp__.py index a6db9997d93..634b4cc0562 100644 --- a/addons/analytic_journal_billing_rate/__terp__.py +++ b/addons/analytic_journal_billing_rate/__terp__.py @@ -19,7 +19,6 @@ # ############################################################################## - { 'name': 'Analytic Journal Billing Rate', 'version': '1.0', diff --git a/addons/auction/auction.py b/addons/auction/auction.py index 1f3e4ac7537..0c275578180 100644 --- a/addons/auction/auction.py +++ b/addons/auction/auction.py @@ -94,12 +94,12 @@ class auction_dates(osv.osv): RETURN: True """ # objects vendus mais non factures - cr.execute('select count(*) as c from auction_lots where auction_id in ('+','.join(map(str,ids))+') and state=%s and obj_price>0', ('draft',)) + cr.execute('select count(*) as c from auction_lots where auction_id in ('+','.join(map(str, ids))+') and state=%s and obj_price>0', ('draft',)) nbr = cr.fetchone()[0] ach_uids = {} - cr.execute('select id from auction_lots where auction_id in ('+','.join(map(str,ids))+') and state=%s and obj_price>0', ('draft',)) + cr.execute('select id from auction_lots where auction_id in ('+','.join(map(str, ids))+') and state=%s and obj_price>0', ('draft',)) r=self.pool.get('auction.lots').lots_invoice(cr, uid, [x[0] for x in cr.fetchall()],{},None) - cr.execute('select id from auction_lots where auction_id in ('+','.join(map(str,ids))+') and obj_price>0') + cr.execute('select id from auction_lots where auction_id in ('+','.join(map(str, ids))+') and obj_price>0') ids2 = [x[0] for x in cr.fetchall()] # for auction in auction_ids: c=self.pool.get('auction.lots').seller_trans_create(cr, uid, ids2,{}) diff --git a/addons/auction/barcode/__init__.py b/addons/auction/barcode/__init__.py index bfa51978b0d..1f03cafa4a7 100644 --- a/addons/auction/barcode/__init__.py +++ b/addons/auction/barcode/__init__.py @@ -1,34 +1,35 @@ -#
-# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-__version__ = '0.9'
+# -*- coding: utf-8 -*- +# +# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Tyler C. Sarna. +# 4. Neither the name of the author nor the names of contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +__version__ = '0.9' # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auction/barcode/code128.py b/addons/auction/barcode/code128.py index 64ab5bc46d4..0cd75e2ddcc 100644 --- a/addons/auction/barcode/code128.py +++ b/addons/auction/barcode/code128.py @@ -1,322 +1,323 @@ -#
-# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.lib.units import inch
-from common import MultiWidthBarcode
-from string import digits
-
-_patterns = {
- 0 : 'BaBbBb', 1 : 'BbBaBb', 2 : 'BbBbBa',
- 3 : 'AbAbBc', 4 : 'AbAcBb', 5 : 'AcAbBb',
- 6 : 'AbBbAc', 7 : 'AbBcAb', 8 : 'AcBbAb',
- 9 : 'BbAbAc', 10 : 'BbAcAb', 11 : 'BcAbAb',
- 12 : 'AaBbCb', 13 : 'AbBaCb', 14 : 'AbBbCa',
- 15 : 'AaCbBb', 16 : 'AbCaBb', 17 : 'AbCbBa',
- 18 : 'BbCbAa', 19 : 'BbAaCb', 20 : 'BbAbCa',
- 21 : 'BaCbAb', 22 : 'BbCaAb', 23 : 'CaBaCa',
- 24 : 'CaAbBb', 25 : 'CbAaBb', 26 : 'CbAbBa',
- 27 : 'CaBbAb', 28 : 'CbBaAb', 29 : 'CbBbAa',
- 30 : 'BaBaBc', 31 : 'BaBcBa', 32 : 'BcBaBa',
- 33 : 'AaAcBc', 34 : 'AcAaBc', 35 : 'AcAcBa',
- 36 : 'AaBcAc', 37 : 'AcBaAc', 38 : 'AcBcAa',
- 39 : 'BaAcAc', 40 : 'BcAaAc', 41 : 'BcAcAa',
- 42 : 'AaBaCc', 43 : 'AaBcCa', 44 : 'AcBaCa',
- 45 : 'AaCaBc', 46 : 'AaCcBa', 47 : 'AcCaBa',
- 48 : 'CaCaBa', 49 : 'BaAcCa', 50 : 'BcAaCa',
- 51 : 'BaCaAc', 52 : 'BaCcAa', 53 : 'BaCaCa',
- 54 : 'CaAaBc', 55 : 'CaAcBa', 56 : 'CcAaBa',
- 57 : 'CaBaAc', 58 : 'CaBcAa', 59 : 'CcBaAa',
- 60 : 'CaDaAa', 61 : 'BbAdAa', 62 : 'DcAaAa',
- 63 : 'AaAbBd', 64 : 'AaAdBb', 65 : 'AbAaBd',
- 66 : 'AbAdBa', 67 : 'AdAaBb', 68 : 'AdAbBa',
- 69 : 'AaBbAd', 70 : 'AaBdAb', 71 : 'AbBaAd',
- 72 : 'AbBdAa', 73 : 'AdBaAb', 74 : 'AdBbAa',
- 75 : 'BdAbAa', 76 : 'BbAaAd', 77 : 'DaCaAa',
- 78 : 'BdAaAb', 79 : 'AcDaAa', 80 : 'AaAbDb',
- 81 : 'AbAaDb', 82 : 'AbAbDa', 83 : 'AaDbAb',
- 84 : 'AbDaAb', 85 : 'AbDbAa', 86 : 'DaAbAb',
- 87 : 'DbAaAb', 88 : 'DbAbAa', 89 : 'BaBaDa',
- 90 : 'BaDaBa', 91 : 'DaBaBa', 92 : 'AaAaDc',
- 93 : 'AaAcDa', 94 : 'AcAaDa', 95 : 'AaDaAc',
- 96 : 'AaDcAa', 97 : 'DaAaAc', 98 : 'DaAcAa',
- 99 : 'AaCaDa', 100 : 'AaDaCa', 101 : 'CaAaDa',
- 102 : 'DaAaCa', 103 : 'BaAdAb', 104 : 'BaAbAd',
- 105 : 'BaAbCb', 106 : 'BcCaAaB'
-}
-
-starta, startb, startc, stop = 103, 104, 105, 106
-
-seta = {
- ' ' : 0, '!' : 1, '"' : 2, '#' : 3,
- '$' : 4, '%' : 5, '&' : 6, '\'' : 7,
- '(' : 8, ')' : 9, '*' : 10, '+' : 11,
- ',' : 12, '-' : 13, '.' : 14, '/' : 15,
- '0' : 16, '1' : 17, '2' : 18, '3' : 19,
- '4' : 20, '5' : 21, '6' : 22, '7' : 23,
- '8' : 24, '9' : 25, ':' : 26, ';' : 27,
- '<' : 28, '=' : 29, '>' : 30, '?' : 31,
- '@' : 32, 'A' : 33, 'B' : 34, 'C' : 35,
- 'D' : 36, 'E' : 37, 'F' : 38, 'G' : 39,
- 'H' : 40, 'I' : 41, 'J' : 42, 'K' : 43,
- 'L' : 44, 'M' : 45, 'N' : 46, 'O' : 47,
- 'P' : 48, 'Q' : 49, 'R' : 50, 'S' : 51,
- 'T' : 52, 'U' : 53, 'V' : 54, 'W' : 55,
- 'X' : 56, 'Y' : 57, 'Z' : 58, '[' : 59,
- '\\' : 60, ']' : 61, '^' : 62, '_' : 63,
- '\x00' : 64, '\x01' : 65, '\x02' : 66, '\x03' : 67,
- '\x04' : 68, '\x05' : 69, '\x06' : 70, '\x07' : 71,
- '\x08' : 72, '\x09' : 73, '\x0a' : 74, '\x0b' : 75,
- '\x0c' : 76, '\x0d' : 77, '\x0e' : 78, '\x0f' : 79,
- '\x10' : 80, '\x11' : 81, '\x12' : 82, '\x13' : 83,
- '\x14' : 84, '\x15' : 85, '\x16' : 86, '\x17' : 87,
- '\x18' : 88, '\x19' : 89, '\x1a' : 90, '\x1b' : 91,
- '\x1c' : 92, '\x1d' : 93, '\x1e' : 94, '\x1f' : 95,
- '\xf3' : 96, '\xf2' : 97, 'SHIFT' : 98, 'TO_C' : 99,
- 'TO_B' : 100, '\xf4' : 101, '\xf1' : 102
-}
-
-setb = {
- ' ' : 0, '!' : 1, '"' : 2, '#' : 3,
- '$' : 4, '%' : 5, '&' : 6, '\'' : 7,
- '(' : 8, ')' : 9, '*' : 10, '+' : 11,
- ',' : 12, '-' : 13, '.' : 14, '/' : 15,
- '0' : 16, '1' : 17, '2' : 18, '3' : 19,
- '4' : 20, '5' : 21, '6' : 22, '7' : 23,
- '8' : 24, '9' : 25, ':' : 26, ';' : 27,
- '<' : 28, '=' : 29, '>' : 30, '?' : 31,
- '@' : 32, 'A' : 33, 'B' : 34, 'C' : 35,
- 'D' : 36, 'E' : 37, 'F' : 38, 'G' : 39,
- 'H' : 40, 'I' : 41, 'J' : 42, 'K' : 43,
- 'L' : 44, 'M' : 45, 'N' : 46, 'O' : 47,
- 'P' : 48, 'Q' : 49, 'R' : 50, 'S' : 51,
- 'T' : 52, 'U' : 53, 'V' : 54, 'W' : 55,
- 'X' : 56, 'Y' : 57, 'Z' : 58, '[' : 59,
- '\\' : 60, ']' : 61, '^' : 62, '_' : 63,
- '`' : 64, 'a' : 65, 'b' : 66, 'c' : 67,
- 'd' : 68, 'e' : 69, 'f' : 70, 'g' : 71,
- 'h' : 72, 'i' : 73, 'j' : 74, 'k' : 75,
- 'l' : 76, 'm' : 77, 'n' : 78, 'o' : 79,
- 'p' : 80, 'q' : 81, 'r' : 82, 's' : 83,
- 't' : 84, 'u' : 85, 'v' : 86, 'w' : 87,
- 'x' : 88, 'y' : 89, 'z' : 90, '{' : 91,
- '|' : 92, '}' : 93, '~' : 94, '\x7f' : 95,
- '\xf3' : 96, '\xf2' : 97, 'SHIFT' : 98, 'TO_C' : 99,
- '\xf4' : 100, 'TO_A' : 101, '\xf1' : 102
-}
-
-setc = {
- '00': 0, '01': 1, '02': 2, '03': 3, '04': 4,
- '05': 5, '06': 6, '07': 7, '08': 8, '09': 9,
- '10':10, '11':11, '12':12, '13':13, '14':14,
- '15':15, '16':16, '17':17, '18':18, '19':19,
- '20':20, '21':21, '22':22, '23':23, '24':24,
- '25':25, '26':26, '27':27, '28':28, '29':29,
- '30':30, '31':31, '32':32, '33':33, '34':34,
- '35':35, '36':36, '37':37, '38':38, '39':39,
- '40':40, '41':41, '42':42, '43':43, '44':44,
- '45':45, '46':46, '47':47, '48':48, '49':49,
- '50':50, '51':51, '52':52, '53':53, '54':54,
- '55':55, '56':56, '57':57, '58':58, '59':59,
- '60':60, '61':61, '62':62, '63':63, '64':64,
- '65':65, '66':66, '67':67, '68':68, '69':69,
- '70':70, '71':71, '72':72, '73':73, '74':74,
- '75':75, '76':76, '77':77, '78':78, '79':79,
- '80':80, '81':81, '82':82, '83':83, '84':84,
- '85':85, '86':86, '87':87, '88':88, '89':89,
- '90':90, '91':91, '92':92, '93':93, '94':94,
- '95':95, '96':96, '97':97, '98':98, '99':99,
-
- 'TO_B' : 100, 'TO_A' : 101, '\xf1' : 102
-}
-
-setmap = {
- 'TO_A' : (seta, setb),
- 'TO_B' : (setb, seta),
- 'TO_C' : (setc, None),
- 'START_A' : (starta, seta, setb),
- 'START_B' : (startb, setb, seta),
- 'START_C' : (startc, setc, None),
-}
-tos = setmap.keys()
-
-class Code128(MultiWidthBarcode):
- """
- Code 128 is a very compact symbology that can encode the entire
- 128 character ASCII set, plus 4 special control codes,
- (FNC1-FNC4, expressed in the input string as \xf1 to \xf4).
- Code 128 can also encode digits at double density (2 per byte)
- and has a mandatory checksum. Code 128 is well supported and
- commonly used -- for example, by UPS for tracking labels.
-
- Because of these qualities, Code 128 is probably the best choice
- for a linear symbology today (assuming you have a choice).
-
- Options that may be passed to constructor:
-
- value (int, or numeric string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
- Minumum is .0075 inch (7.5 mils).
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or 10 xdim
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Code 128:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/code_128.html
- http://www.adams1.com/pub/russadam/128code.html
- http://www.barcodeman.com/c128.html
-
- Official Spec, "ANSI/AIM BC4-1999, ISS" is available for US$45 from
- http://www.aimglobal.org/aimstore/
- """
- def __init__(self, value='', **args):
- self.xdim = inch * 0.0075
- self.lquiet = None
- self.rquiet = None
- self.quiet = 1
- self.height = None
-
- if type(value) is type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = max(inch * 0.25, self.xdim * 10.0)
- self.rquiet = max(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- MultiWidthBarcode.__init__(self, value)
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in self.value:
- if ord(c) > 127 and c not in '\xf1\xf2\xf3\xf4':
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def _trailingDigitsToC(self, l):
- # Optimization: trailing digits -> set C double-digits
- c = 1
- savings = -1 # the TO_C costs one character
- rl = ['STOP']
- while c < len(l):
- i = (-c - 1)
- if l[i] == '\xf1':
- c = c + 1
- rl.insert(0, '\xf1')
- continue
- elif len(l[i]) == 1 and l[i] in digits \
- and len(l[i-1]) == 1 and l[i-1] in digits:
- c = c + 2
- savings = savings + 1
- rl.insert(0, l[i-1] + l[i])
- continue
- else:
- break
- if savings > 0:
- return l[:-c] + ['TO_C'] + rl
- else:
- return l
-
- def encode(self):
- # First, encode using only B
- s = self.validated
- l = ['START_B']
- for c in s:
- if not setb.has_key(c):
- l = l + ['TO_A', c, 'TO_B']
- else:
- l.append(c)
- l.append('STOP')
-
- l = self._trailingDigitsToC(l)
-
- # Finally, replace START_X,TO_Y with START_Y
- if l[1] in tos:
- l[:2] = ['START_' + l[1][-1]]
-
-# print `l`
-
- # encode into numbers
- start, set, shset = setmap[l[0]]
- e = [start]
-
- l = l[1:-1]
- while l:
- c = l[0]
- if c == 'SHIFT':
- e = e + [set[c], shset[l[1]]]
- l = l[2:]
- elif c in tos:
- e.append(set[c])
- set, shset = setmap[c]
- l = l[1:]
- else:
- e.append(set[c])
- l = l[1:]
-
- c = e[0]
- for i in range(1, len(e)):
- c = c + i * e[i]
- self.encoded = e + [c % 103, stop]
- return self.encoded
-
- def decompose(self):
- dval = ''
- for c in self.encoded:
- dval = dval + _patterns[c]
- self.decomposed = dval
- return self.decomposed
+# -*- coding: utf-8 -*- +# +# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Tyler C. Sarna. +# 4. Neither the name of the author nor the names of contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +from reportlab.lib.units import inch +from common import MultiWidthBarcode +from string import digits + +_patterns = { + 0 : 'BaBbBb', 1 : 'BbBaBb', 2 : 'BbBbBa', + 3 : 'AbAbBc', 4 : 'AbAcBb', 5 : 'AcAbBb', + 6 : 'AbBbAc', 7 : 'AbBcAb', 8 : 'AcBbAb', + 9 : 'BbAbAc', 10 : 'BbAcAb', 11 : 'BcAbAb', + 12 : 'AaBbCb', 13 : 'AbBaCb', 14 : 'AbBbCa', + 15 : 'AaCbBb', 16 : 'AbCaBb', 17 : 'AbCbBa', + 18 : 'BbCbAa', 19 : 'BbAaCb', 20 : 'BbAbCa', + 21 : 'BaCbAb', 22 : 'BbCaAb', 23 : 'CaBaCa', + 24 : 'CaAbBb', 25 : 'CbAaBb', 26 : 'CbAbBa', + 27 : 'CaBbAb', 28 : 'CbBaAb', 29 : 'CbBbAa', + 30 : 'BaBaBc', 31 : 'BaBcBa', 32 : 'BcBaBa', + 33 : 'AaAcBc', 34 : 'AcAaBc', 35 : 'AcAcBa', + 36 : 'AaBcAc', 37 : 'AcBaAc', 38 : 'AcBcAa', + 39 : 'BaAcAc', 40 : 'BcAaAc', 41 : 'BcAcAa', + 42 : 'AaBaCc', 43 : 'AaBcCa', 44 : 'AcBaCa', + 45 : 'AaCaBc', 46 : 'AaCcBa', 47 : 'AcCaBa', + 48 : 'CaCaBa', 49 : 'BaAcCa', 50 : 'BcAaCa', + 51 : 'BaCaAc', 52 : 'BaCcAa', 53 : 'BaCaCa', + 54 : 'CaAaBc', 55 : 'CaAcBa', 56 : 'CcAaBa', + 57 : 'CaBaAc', 58 : 'CaBcAa', 59 : 'CcBaAa', + 60 : 'CaDaAa', 61 : 'BbAdAa', 62 : 'DcAaAa', + 63 : 'AaAbBd', 64 : 'AaAdBb', 65 : 'AbAaBd', + 66 : 'AbAdBa', 67 : 'AdAaBb', 68 : 'AdAbBa', + 69 : 'AaBbAd', 70 : 'AaBdAb', 71 : 'AbBaAd', + 72 : 'AbBdAa', 73 : 'AdBaAb', 74 : 'AdBbAa', + 75 : 'BdAbAa', 76 : 'BbAaAd', 77 : 'DaCaAa', + 78 : 'BdAaAb', 79 : 'AcDaAa', 80 : 'AaAbDb', + 81 : 'AbAaDb', 82 : 'AbAbDa', 83 : 'AaDbAb', + 84 : 'AbDaAb', 85 : 'AbDbAa', 86 : 'DaAbAb', + 87 : 'DbAaAb', 88 : 'DbAbAa', 89 : 'BaBaDa', + 90 : 'BaDaBa', 91 : 'DaBaBa', 92 : 'AaAaDc', + 93 : 'AaAcDa', 94 : 'AcAaDa', 95 : 'AaDaAc', + 96 : 'AaDcAa', 97 : 'DaAaAc', 98 : 'DaAcAa', + 99 : 'AaCaDa', 100 : 'AaDaCa', 101 : 'CaAaDa', + 102 : 'DaAaCa', 103 : 'BaAdAb', 104 : 'BaAbAd', + 105 : 'BaAbCb', 106 : 'BcCaAaB' +} + +starta, startb, startc, stop = 103, 104, 105, 106 + +seta = { + ' ' : 0, '!' : 1, '"' : 2, '#' : 3, + '$' : 4, '%' : 5, '&' : 6, '\'' : 7, + '(' : 8, ')' : 9, '*' : 10, '+' : 11, + ',' : 12, '-' : 13, '.' : 14, '/' : 15, + '0' : 16, '1' : 17, '2' : 18, '3' : 19, + '4' : 20, '5' : 21, '6' : 22, '7' : 23, + '8' : 24, '9' : 25, ':' : 26, ';' : 27, + '<' : 28, '=' : 29, '>' : 30, '?' : 31, + '@' : 32, 'A' : 33, 'B' : 34, 'C' : 35, + 'D' : 36, 'E' : 37, 'F' : 38, 'G' : 39, + 'H' : 40, 'I' : 41, 'J' : 42, 'K' : 43, + 'L' : 44, 'M' : 45, 'N' : 46, 'O' : 47, + 'P' : 48, 'Q' : 49, 'R' : 50, 'S' : 51, + 'T' : 52, 'U' : 53, 'V' : 54, 'W' : 55, + 'X' : 56, 'Y' : 57, 'Z' : 58, '[' : 59, + '\\' : 60, ']' : 61, '^' : 62, '_' : 63, + '\x00' : 64, '\x01' : 65, '\x02' : 66, '\x03' : 67, + '\x04' : 68, '\x05' : 69, '\x06' : 70, '\x07' : 71, + '\x08' : 72, '\x09' : 73, '\x0a' : 74, '\x0b' : 75, + '\x0c' : 76, '\x0d' : 77, '\x0e' : 78, '\x0f' : 79, + '\x10' : 80, '\x11' : 81, '\x12' : 82, '\x13' : 83, + '\x14' : 84, '\x15' : 85, '\x16' : 86, '\x17' : 87, + '\x18' : 88, '\x19' : 89, '\x1a' : 90, '\x1b' : 91, + '\x1c' : 92, '\x1d' : 93, '\x1e' : 94, '\x1f' : 95, + '\xf3' : 96, '\xf2' : 97, 'SHIFT' : 98, 'TO_C' : 99, + 'TO_B' : 100, '\xf4' : 101, '\xf1' : 102 +} + +setb = { + ' ' : 0, '!' : 1, '"' : 2, '#' : 3, + '$' : 4, '%' : 5, '&' : 6, '\'' : 7, + '(' : 8, ')' : 9, '*' : 10, '+' : 11, + ',' : 12, '-' : 13, '.' : 14, '/' : 15, + '0' : 16, '1' : 17, '2' : 18, '3' : 19, + '4' : 20, '5' : 21, '6' : 22, '7' : 23, + '8' : 24, '9' : 25, ':' : 26, ';' : 27, + '<' : 28, '=' : 29, '>' : 30, '?' : 31, + '@' : 32, 'A' : 33, 'B' : 34, 'C' : 35, + 'D' : 36, 'E' : 37, 'F' : 38, 'G' : 39, + 'H' : 40, 'I' : 41, 'J' : 42, 'K' : 43, + 'L' : 44, 'M' : 45, 'N' : 46, 'O' : 47, + 'P' : 48, 'Q' : 49, 'R' : 50, 'S' : 51, + 'T' : 52, 'U' : 53, 'V' : 54, 'W' : 55, + 'X' : 56, 'Y' : 57, 'Z' : 58, '[' : 59, + '\\' : 60, ']' : 61, '^' : 62, '_' : 63, + '`' : 64, 'a' : 65, 'b' : 66, 'c' : 67, + 'd' : 68, 'e' : 69, 'f' : 70, 'g' : 71, + 'h' : 72, 'i' : 73, 'j' : 74, 'k' : 75, + 'l' : 76, 'm' : 77, 'n' : 78, 'o' : 79, + 'p' : 80, 'q' : 81, 'r' : 82, 's' : 83, + 't' : 84, 'u' : 85, 'v' : 86, 'w' : 87, + 'x' : 88, 'y' : 89, 'z' : 90, '{' : 91, + '|' : 92, '}' : 93, '~' : 94, '\x7f' : 95, + '\xf3' : 96, '\xf2' : 97, 'SHIFT' : 98, 'TO_C' : 99, + '\xf4' : 100, 'TO_A' : 101, '\xf1' : 102 +} + +setc = { + '00': 0, '01': 1, '02': 2, '03': 3, '04': 4, + '05': 5, '06': 6, '07': 7, '08': 8, '09': 9, + '10':10, '11':11, '12':12, '13':13, '14':14, + '15':15, '16':16, '17':17, '18':18, '19':19, + '20':20, '21':21, '22':22, '23':23, '24':24, + '25':25, '26':26, '27':27, '28':28, '29':29, + '30':30, '31':31, '32':32, '33':33, '34':34, + '35':35, '36':36, '37':37, '38':38, '39':39, + '40':40, '41':41, '42':42, '43':43, '44':44, + '45':45, '46':46, '47':47, '48':48, '49':49, + '50':50, '51':51, '52':52, '53':53, '54':54, + '55':55, '56':56, '57':57, '58':58, '59':59, + '60':60, '61':61, '62':62, '63':63, '64':64, + '65':65, '66':66, '67':67, '68':68, '69':69, + '70':70, '71':71, '72':72, '73':73, '74':74, + '75':75, '76':76, '77':77, '78':78, '79':79, + '80':80, '81':81, '82':82, '83':83, '84':84, + '85':85, '86':86, '87':87, '88':88, '89':89, + '90':90, '91':91, '92':92, '93':93, '94':94, + '95':95, '96':96, '97':97, '98':98, '99':99, + + 'TO_B' : 100, 'TO_A' : 101, '\xf1' : 102 +} + +setmap = { + 'TO_A' : (seta, setb), + 'TO_B' : (setb, seta), + 'TO_C' : (setc, None), + 'START_A' : (starta, seta, setb), + 'START_B' : (startb, setb, seta), + 'START_C' : (startc, setc, None), +} +tos = setmap.keys() + +class Code128(MultiWidthBarcode): + """ + Code 128 is a very compact symbology that can encode the entire + 128 character ASCII set, plus 4 special control codes, + (FNC1-FNC4, expressed in the input string as \xf1 to \xf4). + Code 128 can also encode digits at double density (2 per byte) + and has a mandatory checksum. Code 128 is well supported and + commonly used -- for example, by UPS for tracking labels. + + Because of these qualities, Code 128 is probably the best choice + for a linear symbology today (assuming you have a choice). + + Options that may be passed to constructor: + + value (int, or numeric string. required.): + The value to encode. + + xdim (float, default .0075): + X-Dimension, or width of the smallest element + Minumum is .0075 inch (7.5 mils). + + height (float, see default below): + Height of the symbol. Default is the height of the two + bearer bars (if they exist) plus the greater of .25 inch + or .15 times the symbol's length. + + quiet (bool, default 1): + Wether to include quiet zones in the symbol. + + lquiet (float, see default below): + Quiet zone size to left of code, if quiet is true. + Default is the greater of .25 inch, or 10 xdim + + rquiet (float, defaults as above): + Quiet zone size to right left of code, if quiet is true. + + Sources of Information on Code 128: + + http://www.semiconductor.agilent.com/barcode/sg/Misc/code_128.html + http://www.adams1.com/pub/russadam/128code.html + http://www.barcodeman.com/c128.html + + Official Spec, "ANSI/AIM BC4-1999, ISS" is available for US$45 from + http://www.aimglobal.org/aimstore/ + """ + def __init__(self, value='', **args): + self.xdim = inch * 0.0075 + self.lquiet = None + self.rquiet = None + self.quiet = 1 + self.height = None + + if type(value) is type(1): + value = str(value) + + for (k, v) in args.items(): + setattr(self, k, v) + + if self.quiet: + if self.lquiet is None: + self.lquiet = max(inch * 0.25, self.xdim * 10.0) + self.rquiet = max(inch * 0.25, self.xdim * 10.0) + else: + self.lquiet = self.rquiet = 0.0 + + MultiWidthBarcode.__init__(self, value) + + def validate(self): + vval = "" + self.valid = 1 + for c in self.value: + if ord(c) > 127 and c not in '\xf1\xf2\xf3\xf4': + self.valid = 0 + continue + vval = vval + c + self.validated = vval + return vval + + def _trailingDigitsToC(self, l): + # Optimization: trailing digits -> set C double-digits + c = 1 + savings = -1 # the TO_C costs one character + rl = ['STOP'] + while c < len(l): + i = (-c - 1) + if l[i] == '\xf1': + c = c + 1 + rl.insert(0, '\xf1') + continue + elif len(l[i]) == 1 and l[i] in digits \ + and len(l[i-1]) == 1 and l[i-1] in digits: + c = c + 2 + savings = savings + 1 + rl.insert(0, l[i-1] + l[i]) + continue + else: + break + if savings > 0: + return l[:-c] + ['TO_C'] + rl + else: + return l + + def encode(self): + # First, encode using only B + s = self.validated + l = ['START_B'] + for c in s: + if not setb.has_key(c): + l = l + ['TO_A', c, 'TO_B'] + else: + l.append(c) + l.append('STOP') + + l = self._trailingDigitsToC(l) + + # Finally, replace START_X,TO_Y with START_Y + if l[1] in tos: + l[:2] = ['START_' + l[1][-1]] + +# print `l` + + # encode into numbers + start, set, shset = setmap[l[0]] + e = [start] + + l = l[1:-1] + while l: + c = l[0] + if c == 'SHIFT': + e = e + [set[c], shset[l[1]]] + l = l[2:] + elif c in tos: + e.append(set[c]) + set, shset = setmap[c] + l = l[1:] + else: + e.append(set[c]) + l = l[1:] + + c = e[0] + for i in range(1, len(e)): + c = c + i * e[i] + self.encoded = e + [c % 103, stop] + return self.encoded + + def decompose(self): + dval = '' + for c in self.encoded: + dval = dval + _patterns[c] + self.decomposed = dval + return self.decomposed # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auction/barcode/code39.py b/addons/auction/barcode/code39.py index 283f68244a4..a3926c6c48d 100644 --- a/addons/auction/barcode/code39.py +++ b/addons/auction/barcode/code39.py @@ -1,256 +1,257 @@ -#
-# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.lib.units import inch
-from common import Barcode
-import string
-
-_patterns = {
- '0': ("bsbSBsBsb", 0), '1': ("BsbSbsbsB", 1),
- '2': ("bsBSbsbsB", 2), '3': ("BsBSbsbsb", 3),
- '4': ("bsbSBsbsB", 4), '5': ("BsbSBsbsb", 5),
- '6': ("bsBSBsbsb", 6), '7': ("bsbSbsBsB", 7),
- '8': ("BsbSbsBsb", 8), '9': ("bsBSbsBsb", 9),
- 'A': ("BsbsbSbsB", 10), 'B': ("bsBsbSbsB", 11),
- 'C': ("BsBsbSbsb", 12), 'D': ("bsbsBSbsB", 13),
- 'E': ("BsbsBSbsb", 14), 'F': ("bsBsBSbsb", 15),
- 'G': ("bsbsbSBsB", 16), 'H': ("BsbsbSBsb", 17),
- 'I': ("bsBsbSBsb", 18), 'J': ("bsbsBSBsb", 19),
- 'K': ("BsbsbsbSB", 20), 'L': ("bsBsbsbSB", 21),
- 'M': ("BsBsbsbSb", 22), 'N': ("bsbsBsbSB", 23),
- 'O': ("BsbsBsbSb", 24), 'P': ("bsBsBsbSb", 25),
- 'Q': ("bsbsbsBSB", 26), 'R': ("BsbsbsBSb", 27),
- 'S': ("bsBsbsBSb", 28), 'T': ("bsbsBsBSb", 29),
- 'U': ("BSbsbsbsB", 30), 'V': ("bSBsbsbsB", 31),
- 'W': ("BSBsbsbsb", 32), 'X': ("bSbsBsbsB", 33),
- 'Y': ("BSbsBsbsb", 34), 'Z': ("bSBsBsbsb", 35),
- '-': ("bSbsbsBsB", 36), '.': ("BSbsbsBsb", 37),
- ' ': ("bSBsbsBsb", 38), '*': ("bSbsBsBsb", 39),
- '$': ("bSbSbSbsb", 40), '/': ("bSbSbsbSb", 41),
- '+': ("bSbsbSbSb", 42), '%': ("bsbSbSbSb", 43)
-}
-
-_valchars = [
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
- 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
- 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
- 'X', 'Y', 'Z', '-', '.', ' ', '*', '$', '/', '+', '%'
-]
-
-_extended = {
- '\0': "%U", '\01': "$A", '\02': "$B", '\03': "$C",
- '\04': "$D", '\05': "$E", '\06': "$F", '\07': "$G",
- '\010': "$H", '\011': "$I", '\012': "$J", '\013': "$K",
- '\014': "$L", '\015': "$M", '\016': "$N", '\017': "$O",
- '\020': "$P", '\021': "$Q", '\022': "$R", '\023': "$S",
- '\024': "$T", '\025': "$U", '\026': "$V", '\027': "$W",
- '\030': "$X", '\031': "$Y", '\032': "$Z", '\033': "%A",
- '\034': "%B", '\035': "%C", '\036': "%D", '\037': "%E",
- '!': "/A", '"': "/B", '#': "/C", '$': "/D",
- '%': "/E", '&': "/F", '\'': "/G", '(': "/H",
- ')': "/I", '*': "/J", '+': "/K", ',': "/L",
- '/': "/O", ':': "/Z", ';': "%F", '<': "%G",
- '=': "%H", '>': "%I", '?': "%J", '@': "%V",
- '[': "%K", '\\': "%L", ']': "%M", '^': "%N",
- '_': "%O", '`': "%W", 'a': "+A", 'b': "+B",
- 'c': "+C", 'd': "+D", 'e': "+E", 'f': "+F",
- 'g': "+G", 'h': "+H", 'i': "+I", 'j': "+J",
- 'k': "+K", 'l': "+L", 'm': "+M", 'n': "+N",
- 'o': "+O", 'p': "+P", 'q': "+Q", 'r': "+R",
- 's': "+S", 't': "+T", 'u': "+U", 'v': "+V",
- 'w': "+W", 'x': "+X", 'y': "+Y", 'z': "+Z",
- '{': "%P", '|': "%Q", '}': "%R", '~': "%S",
- '\177': "%T"
-}
-
-
-_stdchrs = string.digits + string.uppercase + "-. *$/+%"
-_extchrs = _stdchrs + string.lowercase + \
- "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017" + \
- "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" + \
- "!'#&\"(),:;<=>?@[\\]^_`{|}~\177"
-
-
-def _encode39(str, cksum):
- newval = "*"
- v = 0
- for c in str:
- v = v + _patterns[c][1]
- newval = newval + c
- v = v % 43
- if cksum:
- newval = newval + _valchars[v]
- return newval + '*'
-
-
-class _Code39Base(Barcode):
- def __init__(self, value = "", **args):
- self.xdim = inch * 0.0075
- self.lquiet = None
- self.rquiet = None
- self.quiet = 1
- self.gap = None
- self.height = None
- self.ratio = 2.2
- self.checksum = 0
- self.bearers = 0.0
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = max(inch * 0.25, self.xdim * 10.0)
- self.rquiet = max(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- Barcode.__init__(self, value)
-
- def decompose(self):
- dval = ""
- for c in self.encoded:
- dval = dval + _patterns[c][0] + 'i'
- self.decomposed = dval[:-1]
- return self.decomposed
-
-
-class Standard39(_Code39Base):
- """
- Interleaved 2 of 5 is a numeric-only barcode. It encodes an even
- number of digits; if an odd number is given, a 0 is prepended.
-
- Options that may be passed to constructor:
-
- value (int, or numeric string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
- Minumum is .0075 inch (7.5 mils).
-
- ratio (float, default 2.2):
- The ratio of wide elements to narrow elements.
- Must be between 2.0 and 3.0 (or 2.2 and 3.0 if the
- xdim is greater than 20 mils (.02 inch))
-
- gap (float or None, default None):
- width of intercharacter gap. None means "use xdim".
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- checksum (bool, default 0):
- Wether to compute and include the check digit
-
- bearers (float, in units of xdim. default 0):
- Height of bearer bars (horizontal bars along the top and
- bottom of the barcode). Default is 0 (no bearers).
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or .15 times the symbol's
- length.
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Code 39:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/code_39.html
- http://www.adams1.com/pub/russadam/39code.html
- http://www.barcodeman.com/c39_1.html
-
- Official Spec, "ANSI/AIM BC1-1995, USS" is available for US$45 from
- http://www.aimglobal.org/aimstore/
- """
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in self.value:
- if c in string.lowercase:
- c = string.upper(c)
- if c not in _stdchrs:
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- self.encoded = _encode39(self.validated, self.checksum)
- return self.encoded
-
-
-class Extended39(_Code39Base):
- """
- Extended Code 39 is a convention for encoding additional characters
- not present in stanmdard Code 39 by using pairs of characters to
- represent the characters missing in Standard Code 39.
-
- See Standard39 for arguments.
-
- Sources of Information on Extended Code 39:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/xcode_39.html
- http://www.barcodeman.com/c39_ext.html
- """
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in self.value:
- if c not in _extchrs:
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- self.encoded = ""
- for c in self.validated:
- if _extended.has_key(c):
- self.encoded = self.encoded + _extended[c]
- elif c in _stdchrs:
- self.encoded = self.encoded + c
- else:
- raise ValueError
- self.encoded = _encode39(self.encoded, self.checksum)
- return self.encoded
+# -*- coding: utf-8 -*- +# +# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Tyler C. Sarna. +# 4. Neither the name of the author nor the names of contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +from reportlab.lib.units import inch +from common import Barcode +import string + +_patterns = { + '0': ("bsbSBsBsb", 0), '1': ("BsbSbsbsB", 1), + '2': ("bsBSbsbsB", 2), '3': ("BsBSbsbsb", 3), + '4': ("bsbSBsbsB", 4), '5': ("BsbSBsbsb", 5), + '6': ("bsBSBsbsb", 6), '7': ("bsbSbsBsB", 7), + '8': ("BsbSbsBsb", 8), '9': ("bsBSbsBsb", 9), + 'A': ("BsbsbSbsB", 10), 'B': ("bsBsbSbsB", 11), + 'C': ("BsBsbSbsb", 12), 'D': ("bsbsBSbsB", 13), + 'E': ("BsbsBSbsb", 14), 'F': ("bsBsBSbsb", 15), + 'G': ("bsbsbSBsB", 16), 'H': ("BsbsbSBsb", 17), + 'I': ("bsBsbSBsb", 18), 'J': ("bsbsBSBsb", 19), + 'K': ("BsbsbsbSB", 20), 'L': ("bsBsbsbSB", 21), + 'M': ("BsBsbsbSb", 22), 'N': ("bsbsBsbSB", 23), + 'O': ("BsbsBsbSb", 24), 'P': ("bsBsBsbSb", 25), + 'Q': ("bsbsbsBSB", 26), 'R': ("BsbsbsBSb", 27), + 'S': ("bsBsbsBSb", 28), 'T': ("bsbsBsBSb", 29), + 'U': ("BSbsbsbsB", 30), 'V': ("bSBsbsbsB", 31), + 'W': ("BSBsbsbsb", 32), 'X': ("bSbsBsbsB", 33), + 'Y': ("BSbsBsbsb", 34), 'Z': ("bSBsBsbsb", 35), + '-': ("bSbsbsBsB", 36), '.': ("BSbsbsBsb", 37), + ' ': ("bSBsbsBsb", 38), '*': ("bSbsBsBsb", 39), + '$': ("bSbSbSbsb", 40), '/': ("bSbSbsbSb", 41), + '+': ("bSbsbSbSb", 42), '%': ("bsbSbSbSb", 43) +} + +_valchars = [ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', + 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', + 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '-', '.', ' ', '*', '$', '/', '+', '%' +] + +_extended = { + '\0': "%U", '\01': "$A", '\02': "$B", '\03': "$C", + '\04': "$D", '\05': "$E", '\06': "$F", '\07': "$G", + '\010': "$H", '\011': "$I", '\012': "$J", '\013': "$K", + '\014': "$L", '\015': "$M", '\016': "$N", '\017': "$O", + '\020': "$P", '\021': "$Q", '\022': "$R", '\023': "$S", + '\024': "$T", '\025': "$U", '\026': "$V", '\027': "$W", + '\030': "$X", '\031': "$Y", '\032': "$Z", '\033': "%A", + '\034': "%B", '\035': "%C", '\036': "%D", '\037': "%E", + '!': "/A", '"': "/B", '#': "/C", '$': "/D", + '%': "/E", '&': "/F", '\'': "/G", '(': "/H", + ')': "/I", '*': "/J", '+': "/K", ',': "/L", + '/': "/O", ':': "/Z", ';': "%F", '<': "%G", + '=': "%H", '>': "%I", '?': "%J", '@': "%V", + '[': "%K", '\\': "%L", ']': "%M", '^': "%N", + '_': "%O", '`': "%W", 'a': "+A", 'b': "+B", + 'c': "+C", 'd': "+D", 'e': "+E", 'f': "+F", + 'g': "+G", 'h': "+H", 'i': "+I", 'j': "+J", + 'k': "+K", 'l': "+L", 'm': "+M", 'n': "+N", + 'o': "+O", 'p': "+P", 'q': "+Q", 'r': "+R", + 's': "+S", 't': "+T", 'u': "+U", 'v': "+V", + 'w': "+W", 'x': "+X", 'y': "+Y", 'z': "+Z", + '{': "%P", '|': "%Q", '}': "%R", '~': "%S", + '\177': "%T" +} + + +_stdchrs = string.digits + string.uppercase + "-. *$/+%" +_extchrs = _stdchrs + string.lowercase + \ + "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017" + \ + "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" + \ + "!'#&\"(),:;<=>?@[\\]^_`{|}~\177" + + +def _encode39(str, cksum): + newval = "*" + v = 0 + for c in str: + v = v + _patterns[c][1] + newval = newval + c + v = v % 43 + if cksum: + newval = newval + _valchars[v] + return newval + '*' + + +class _Code39Base(Barcode): + def __init__(self, value = "", **args): + self.xdim = inch * 0.0075 + self.lquiet = None + self.rquiet = None + self.quiet = 1 + self.gap = None + self.height = None + self.ratio = 2.2 + self.checksum = 0 + self.bearers = 0.0 + + for (k, v) in args.items(): + setattr(self, k, v) + + if self.quiet: + if self.lquiet is None: + self.lquiet = max(inch * 0.25, self.xdim * 10.0) + self.rquiet = max(inch * 0.25, self.xdim * 10.0) + else: + self.lquiet = self.rquiet = 0.0 + + Barcode.__init__(self, value) + + def decompose(self): + dval = "" + for c in self.encoded: + dval = dval + _patterns[c][0] + 'i' + self.decomposed = dval[:-1] + return self.decomposed + + +class Standard39(_Code39Base): + """ + Interleaved 2 of 5 is a numeric-only barcode. It encodes an even + number of digits; if an odd number is given, a 0 is prepended. + + Options that may be passed to constructor: + + value (int, or numeric string. required.): + The value to encode. + + xdim (float, default .0075): + X-Dimension, or width of the smallest element + Minumum is .0075 inch (7.5 mils). + + ratio (float, default 2.2): + The ratio of wide elements to narrow elements. + Must be between 2.0 and 3.0 (or 2.2 and 3.0 if the + xdim is greater than 20 mils (.02 inch)) + + gap (float or None, default None): + width of intercharacter gap. None means "use xdim". + + height (float, see default below): + Height of the symbol. Default is the height of the two + bearer bars (if they exist) plus the greater of .25 inch + or .15 times the symbol's length. + + checksum (bool, default 0): + Wether to compute and include the check digit + + bearers (float, in units of xdim. default 0): + Height of bearer bars (horizontal bars along the top and + bottom of the barcode). Default is 0 (no bearers). + + quiet (bool, default 1): + Wether to include quiet zones in the symbol. + + lquiet (float, see default below): + Quiet zone size to left of code, if quiet is true. + Default is the greater of .25 inch, or .15 times the symbol's + length. + + rquiet (float, defaults as above): + Quiet zone size to right left of code, if quiet is true. + + Sources of Information on Code 39: + + http://www.semiconductor.agilent.com/barcode/sg/Misc/code_39.html + http://www.adams1.com/pub/russadam/39code.html + http://www.barcodeman.com/c39_1.html + + Official Spec, "ANSI/AIM BC1-1995, USS" is available for US$45 from + http://www.aimglobal.org/aimstore/ + """ + + def validate(self): + vval = "" + self.valid = 1 + for c in self.value: + if c in string.lowercase: + c = string.upper(c) + if c not in _stdchrs: + self.valid = 0 + continue + vval = vval + c + self.validated = vval + return vval + + def encode(self): + self.encoded = _encode39(self.validated, self.checksum) + return self.encoded + + +class Extended39(_Code39Base): + """ + Extended Code 39 is a convention for encoding additional characters + not present in stanmdard Code 39 by using pairs of characters to + represent the characters missing in Standard Code 39. + + See Standard39 for arguments. + + Sources of Information on Extended Code 39: + + http://www.semiconductor.agilent.com/barcode/sg/Misc/xcode_39.html + http://www.barcodeman.com/c39_ext.html + """ + + def validate(self): + vval = "" + self.valid = 1 + for c in self.value: + if c not in _extchrs: + self.valid = 0 + continue + vval = vval + c + self.validated = vval + return vval + + def encode(self): + self.encoded = "" + for c in self.validated: + if _extended.has_key(c): + self.encoded = self.encoded + _extended[c] + elif c in _stdchrs: + self.encoded = self.encoded + c + else: + raise ValueError + self.encoded = _encode39(self.encoded, self.checksum) + return self.encoded # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auction/barcode/code93.py b/addons/auction/barcode/code93.py index bb556829687..697841092a1 100644 --- a/addons/auction/barcode/code93.py +++ b/addons/auction/barcode/code93.py @@ -1,233 +1,234 @@ -#
-# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.lib.units import inch
-from common import MultiWidthBarcode
-import string
-
-_patterns = {
- '0' : ('AcAaAb', 0), '1' : ('AaAbAc', 1), '2' : ('AaAcAb', 2),
- '3' : ('AaAdAa', 3), '4' : ('AbAaAc', 4), '5' : ('AbAbAb', 5),
- '6' : ('AbAcAa', 6), '7' : ('AaAaAd', 7), '8' : ('AcAbAa', 8),
- '9' : ('AdAaAa', 9), 'A' : ('BaAaAc', 10), 'B' : ('BaAbAb', 11),
- 'C' : ('BaAcAa', 12), 'D' : ('BbAaAb', 13), 'E' : ('BbAbAa', 14),
- 'F' : ('BcAaAa', 15), 'G' : ('AaBaAc', 16), 'H' : ('AaBbAb', 17),
- 'I' : ('AaBcAa', 18), 'J' : ('AbBaAb', 19), 'K' : ('AcBaAa', 20),
- 'L' : ('AaAaBc', 21), 'M' : ('AaAbBb', 22), 'N' : ('AaAcBa', 23),
- 'O' : ('AbAaBb', 24), 'P' : ('AcAaBa', 25), 'Q' : ('BaBaAb', 26),
- 'R' : ('BaBbAa', 27), 'S' : ('BaAaBb', 28), 'T' : ('BaAbBa', 29),
- 'U' : ('BbAaBa', 30), 'V' : ('BbBaAa', 31), 'W' : ('AaBaBb', 32),
- 'X' : ('AaBbBa', 33), 'Y' : ('AbBaBa', 34), 'Z' : ('AbCaAa', 35),
- '-' : ('AbAaCa', 36), '.' : ('CaAaAb', 37), ' ' : ('CaAbAa', 38),
- '$' : ('CbAaAa', 39), '/' : ('AaBaCa', 40), '+' : ('AaCaBa', 41),
- '%' : ('BaAaCa', 42), '#' : ('AbAbBa', 43), '!' : ('CaBaAa', 44),
- '=' : ('CaAaBa', 45), '&' : ('AbBbAa', 46),
- 'start' : ('AaAaDa', -1), 'stop' : ('AaAaDaA', -2)
-}
-
-_charsbyval = {}
-for k, v in _patterns.items():
- _charsbyval[v[1]] = k
-
-_extended = {
- '\x00' : '!U', '\x01' : '#A', '\x02' : '#B', '\x03' : '#C',
- '\x04' : '#D', '\x05' : '#E', '\x06' : '#F', '\x07' : '#G',
- '\x08' : '#H', '\x09' : '#I', '\x0a' : '#J', '\x0b' : '#K',
- '\x0c' : '#L', '\x0d' : '#M', '\x0e' : '#N', '\x0f' : '#O',
- '\x10' : '#P', '\x11' : '#Q', '\x12' : '#R', '\x13' : '#S',
- '\x14' : '#T', '\x15' : '#U', '\x16' : '#V', '\x17' : '#W',
- '\x18' : '#X', '\x19' : '#Y', '\x1a' : '#Z', '\x1b' : '!A',
- '\x1c' : '!B', '\x1d' : '!C', '\x1e' : '!D', '\x1f' : '!E',
- '!' : '=A', '"' : '=B', '#' : '=C', '$' : '=D',
- '%' : '=E', '&' : '=F', '\'' : '=G', '(' : '=H',
- ')' : '=I', '*' : '=J', '+' : '=K', ',' : '=L',
- '/' : '=O', ':' : '=Z', ';' : '!F', '<' : '!G',
- '=' : '!H', '>' : '!I', '?' : '!J', '@' : '!V',
- '[' : '!K', '\\' : '!L', ']' : '!M', '^' : '!N',
- '_' : '!O', '`' : '!W', 'a' : '&A', 'b' : '&B',
- 'c' : '&C', 'd' : '&D', 'e' : '&E', 'f' : '&F',
- 'g' : '&G', 'h' : '&H', 'i' : '&I', 'j' : '&J',
- 'k' : '&K', 'l' : '&L', 'm' : '&M', 'n' : '&N',
- 'o' : '&O', 'p' : '&P', 'q' : '&Q', 'r' : '&R',
- 's' : '&S', 't' : '&T', 'u' : '&U', 'v' : '&V',
- 'w' : '&W', 'x' : '&X', 'y' : '&Y', 'z' : '&Z',
- '{' : '!P', '|' : '!Q', '}' : '!R', '~' : '!S',
- '\x7f' : '!T'
-}
-
-
-def _encode93(str):
- s = map(None, str)
- s.reverse()
-
- # compute 'C' checksum
- i = 0; v = 1; c = 0
- while i < len(s):
- c = c + v * _patterns[s[i]][1]
- i = i + 1; v = v + 1
- if v > 20:
- v = 1
- s.insert(0, _charsbyval[c % 47])
-
- # compute 'K' checksum
- i = 0; v = 1; c = 0
- while i < len(s):
- c = c + v * _patterns[s[i]][1]
- i = i + 1; v = v + 1
- if v > 15:
- v = 1
- s.insert(0, _charsbyval[c % 47])
-
- s.reverse()
-
- return string.join(s, '')
-
-
-class _Code93Base(MultiWidthBarcode):
- def __init__(self, value='', **args):
- self.xdim = inch * 0.0075
- self.lquiet = None
- self.rquiet = None
- self.quiet = 1
- self.height = None
-
- if type(value) is type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = max(inch * 0.25, self.xdim * 10.0)
- self.rquiet = max(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- MultiWidthBarcode.__init__(self, value)
-
- def decompose(self):
- dval = _patterns['start'][0]
- for c in self.encoded:
- dval = dval + _patterns[c][0]
- self.decomposed = dval + _patterns['stop'][0]
- return self.decomposed
-
-
-class Standard93(_Code93Base):
- """
- Code 93 is a Uppercase alphanumeric symbology with some punctuation.
- See Extended Code 93 for a variant that can represent the entire
- 128 characrter ASCII set.
-
- Options that may be passed to constructor:
-
- value (int, or numeric string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
- Minumum is .0075 inch (7.5 mils).
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or 10 xdim
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Code 93:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/code_93.html
-
- Official Spec, "NSI/AIM BC5-1995, USS" is available for US$45 from
- http://www.aimglobal.org/aimstore/
- """
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in self.value:
- if c in string.lowercase:
- c = string.upper(c)
- if not _patterns.has_key(c):
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- self.encoded = _encode93(self.validated)
- return self.encoded
-
-
-class Extended93(_Code93Base):
- """
- Extended Code 93 is a convention for encoding the entire 128 character
- set using pairs of characters to represent the characters missing in
- Standard Code 93. It is very much like Extended Code 39 in that way.
-
- See Standard93 for arguments.
- """
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in self.value:
- if not _patterns.has_key(c) and not _extended.has_key(c):
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- self.encoded = ""
- for c in self.validated:
- if _patterns.has_key(c):
- self.encoded = self.encoded + c
- elif _extended.has_key(c):
- self.encoded = self.encoded + _extended[c]
- else:
- raise ValueError
- self.encoded = _encode93(self.encoded)
- return self.encoded
+# -*- coding: utf-8 -*- +# +# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Tyler C. Sarna. +# 4. Neither the name of the author nor the names of contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +from reportlab.lib.units import inch +from common import MultiWidthBarcode +import string + +_patterns = { + '0' : ('AcAaAb', 0), '1' : ('AaAbAc', 1), '2' : ('AaAcAb', 2), + '3' : ('AaAdAa', 3), '4' : ('AbAaAc', 4), '5' : ('AbAbAb', 5), + '6' : ('AbAcAa', 6), '7' : ('AaAaAd', 7), '8' : ('AcAbAa', 8), + '9' : ('AdAaAa', 9), 'A' : ('BaAaAc', 10), 'B' : ('BaAbAb', 11), + 'C' : ('BaAcAa', 12), 'D' : ('BbAaAb', 13), 'E' : ('BbAbAa', 14), + 'F' : ('BcAaAa', 15), 'G' : ('AaBaAc', 16), 'H' : ('AaBbAb', 17), + 'I' : ('AaBcAa', 18), 'J' : ('AbBaAb', 19), 'K' : ('AcBaAa', 20), + 'L' : ('AaAaBc', 21), 'M' : ('AaAbBb', 22), 'N' : ('AaAcBa', 23), + 'O' : ('AbAaBb', 24), 'P' : ('AcAaBa', 25), 'Q' : ('BaBaAb', 26), + 'R' : ('BaBbAa', 27), 'S' : ('BaAaBb', 28), 'T' : ('BaAbBa', 29), + 'U' : ('BbAaBa', 30), 'V' : ('BbBaAa', 31), 'W' : ('AaBaBb', 32), + 'X' : ('AaBbBa', 33), 'Y' : ('AbBaBa', 34), 'Z' : ('AbCaAa', 35), + '-' : ('AbAaCa', 36), '.' : ('CaAaAb', 37), ' ' : ('CaAbAa', 38), + '$' : ('CbAaAa', 39), '/' : ('AaBaCa', 40), '+' : ('AaCaBa', 41), + '%' : ('BaAaCa', 42), '#' : ('AbAbBa', 43), '!' : ('CaBaAa', 44), + '=' : ('CaAaBa', 45), '&' : ('AbBbAa', 46), + 'start' : ('AaAaDa', -1), 'stop' : ('AaAaDaA', -2) +} + +_charsbyval = {} +for k, v in _patterns.items(): + _charsbyval[v[1]] = k + +_extended = { + '\x00' : '!U', '\x01' : '#A', '\x02' : '#B', '\x03' : '#C', + '\x04' : '#D', '\x05' : '#E', '\x06' : '#F', '\x07' : '#G', + '\x08' : '#H', '\x09' : '#I', '\x0a' : '#J', '\x0b' : '#K', + '\x0c' : '#L', '\x0d' : '#M', '\x0e' : '#N', '\x0f' : '#O', + '\x10' : '#P', '\x11' : '#Q', '\x12' : '#R', '\x13' : '#S', + '\x14' : '#T', '\x15' : '#U', '\x16' : '#V', '\x17' : '#W', + '\x18' : '#X', '\x19' : '#Y', '\x1a' : '#Z', '\x1b' : '!A', + '\x1c' : '!B', '\x1d' : '!C', '\x1e' : '!D', '\x1f' : '!E', + '!' : '=A', '"' : '=B', '#' : '=C', '$' : '=D', + '%' : '=E', '&' : '=F', '\'' : '=G', '(' : '=H', + ')' : '=I', '*' : '=J', '+' : '=K', ',' : '=L', + '/' : '=O', ':' : '=Z', ';' : '!F', '<' : '!G', + '=' : '!H', '>' : '!I', '?' : '!J', '@' : '!V', + '[' : '!K', '\\' : '!L', ']' : '!M', '^' : '!N', + '_' : '!O', '`' : '!W', 'a' : '&A', 'b' : '&B', + 'c' : '&C', 'd' : '&D', 'e' : '&E', 'f' : '&F', + 'g' : '&G', 'h' : '&H', 'i' : '&I', 'j' : '&J', + 'k' : '&K', 'l' : '&L', 'm' : '&M', 'n' : '&N', + 'o' : '&O', 'p' : '&P', 'q' : '&Q', 'r' : '&R', + 's' : '&S', 't' : '&T', 'u' : '&U', 'v' : '&V', + 'w' : '&W', 'x' : '&X', 'y' : '&Y', 'z' : '&Z', + '{' : '!P', '|' : '!Q', '}' : '!R', '~' : '!S', + '\x7f' : '!T' +} + + +def _encode93(str): + s = map(None, str) + s.reverse() + + # compute 'C' checksum + i = 0; v = 1; c = 0 + while i < len(s): + c = c + v * _patterns[s[i]][1] + i = i + 1; v = v + 1 + if v > 20: + v = 1 + s.insert(0, _charsbyval[c % 47]) + + # compute 'K' checksum + i = 0; v = 1; c = 0 + while i < len(s): + c = c + v * _patterns[s[i]][1] + i = i + 1; v = v + 1 + if v > 15: + v = 1 + s.insert(0, _charsbyval[c % 47]) + + s.reverse() + + return string.join(s, '') + + +class _Code93Base(MultiWidthBarcode): + def __init__(self, value='', **args): + self.xdim = inch * 0.0075 + self.lquiet = None + self.rquiet = None + self.quiet = 1 + self.height = None + + if type(value) is type(1): + value = str(value) + + for (k, v) in args.items(): + setattr(self, k, v) + + if self.quiet: + if self.lquiet is None: + self.lquiet = max(inch * 0.25, self.xdim * 10.0) + self.rquiet = max(inch * 0.25, self.xdim * 10.0) + else: + self.lquiet = self.rquiet = 0.0 + + MultiWidthBarcode.__init__(self, value) + + def decompose(self): + dval = _patterns['start'][0] + for c in self.encoded: + dval = dval + _patterns[c][0] + self.decomposed = dval + _patterns['stop'][0] + return self.decomposed + + +class Standard93(_Code93Base): + """ + Code 93 is a Uppercase alphanumeric symbology with some punctuation. + See Extended Code 93 for a variant that can represent the entire + 128 characrter ASCII set. + + Options that may be passed to constructor: + + value (int, or numeric string. required.): + The value to encode. + + xdim (float, default .0075): + X-Dimension, or width of the smallest element + Minumum is .0075 inch (7.5 mils). + + height (float, see default below): + Height of the symbol. Default is the height of the two + bearer bars (if they exist) plus the greater of .25 inch + or .15 times the symbol's length. + + quiet (bool, default 1): + Wether to include quiet zones in the symbol. + + lquiet (float, see default below): + Quiet zone size to left of code, if quiet is true. + Default is the greater of .25 inch, or 10 xdim + + rquiet (float, defaults as above): + Quiet zone size to right left of code, if quiet is true. + + Sources of Information on Code 93: + + http://www.semiconductor.agilent.com/barcode/sg/Misc/code_93.html + + Official Spec, "NSI/AIM BC5-1995, USS" is available for US$45 from + http://www.aimglobal.org/aimstore/ + """ + + def validate(self): + vval = "" + self.valid = 1 + for c in self.value: + if c in string.lowercase: + c = string.upper(c) + if not _patterns.has_key(c): + self.valid = 0 + continue + vval = vval + c + self.validated = vval + return vval + + def encode(self): + self.encoded = _encode93(self.validated) + return self.encoded + + +class Extended93(_Code93Base): + """ + Extended Code 93 is a convention for encoding the entire 128 character + set using pairs of characters to represent the characters missing in + Standard Code 93. It is very much like Extended Code 39 in that way. + + See Standard93 for arguments. + """ + + def validate(self): + vval = "" + self.valid = 1 + for c in self.value: + if not _patterns.has_key(c) and not _extended.has_key(c): + self.valid = 0 + continue + vval = vval + c + self.validated = vval + return vval + + def encode(self): + self.encoded = "" + for c in self.validated: + if _patterns.has_key(c): + self.encoded = self.encoded + c + elif _extended.has_key(c): + self.encoded = self.encoded + _extended[c] + else: + raise ValueError + self.encoded = _encode93(self.encoded) + return self.encoded # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auction/barcode/common.py b/addons/auction/barcode/common.py index 0ef19a6e64f..e6933fd1673 100644 --- a/addons/auction/barcode/common.py +++ b/addons/auction/barcode/common.py @@ -1,706 +1,707 @@ -#
-# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.platypus.flowables import Flowable
-from reportlab.lib.units import inch
-import string
-
-class Barcode(Flowable):
- """Abstract Base for barcodes. Includes implementations of
- some methods suitable for the more primitive barcode types"""
-
- def __init__(self, value = ''):
- self.value = value
-
- if not hasattr(self, 'gap'):
- self.gap = None
-
- self.validate()
- self.encode()
- #print self.encoded
- self.decompose()
- #print self.decomposed
- self.computeSize()
-
- def validate(self):
- self.valid = 1
- self.validated = self.value
-
- def encode(self):
- self.encoded = self.validated
-
- def decompose(self):
- self.decomposed = self.encoded
-
- def computeSize(self, *args):
- xdim = self.xdim
- wx = xdim * self.ratio
-
- if self.gap == None:
- self.gap = xdim
-
- w = 0.0
-
- for c in self.decomposed:
- if c in 'sb':
- w = w + xdim
- elif c in 'SB':
- w = w + wx
- else: # 'i'
- w = w + self.gap
-
- if self.height is None:
- self.height = w * 0.15
- self.height = max(0.25 * inch, self.height)
- if self.bearers:
- self.height = self.height + self.bearers * 2.0 * xdim
-
- if self.quiet:
- w = w + self.lquiet + self.rquiet
- self.xo = self.lquiet
- else:
- self.xo = 0.0
-
- self.width = w
-
- def draw(self):
- xdim = self.xdim
- wx = xdim * self.ratio
-
- left = self.xo
- b = self.bearers * xdim
- bb = b * 0.5
- tb = self.height - (b * 1.5)
-
- for c in self.decomposed:
- if c == 'i':
- left = left + self.gap
- elif c == 's':
- left = left + xdim
- elif c == 'S':
- left = left + wx
- elif c == 'b':
- self.rect(left, bb, xdim, tb)
- left = left + xdim
- elif c == 'B':
- self.rect(left, bb, wx, tb)
- left = left + wx
-
- if self.bearers:
- self.rect(self.lquiet, 0.0, \
- self.width - (self.lquiet + self.rquiet), b)
- self.rect(self.lquiet, self.height - b, \
- self.width - (self.lquiet + self.rquiet), b)
-
- def rect(self, x, y, w, h):
- self.canv.rect(x, y, w, h, stroke=0, fill=1)
-
-
-class MultiWidthBarcode(Barcode):
- """Base for variable-bar-width codes like Code93 and Code128"""
-
- def computeSize(self, *args):
- xdim = self.xdim
- oa, oA = ord('a') - 1, ord('A') - 1
-
- w = 0.0
-
- for c in self.decomposed:
- oc = ord(c)
- if c in string.lowercase:
- w = w + xdim * (oc - oa)
- elif c in string.uppercase:
- w = w + xdim * (oc - oA)
-
- if self.height is None:
- self.height = w * 0.15
- self.height = max(0.25 * inch, self.height)
-
- if self.quiet:
- w = w + self.lquiet + self.rquiet
- self.xo = self.lquiet
- else:
- self.xo = 0.0
-
- self.width = w
-
- def draw(self):
- oa, oA = ord('a') - 1, ord('A') - 1
- xdim = self.xdim
- left = self.xo
-
- for c in self.decomposed:
- oc = ord(c)
- if c in string.lowercase:
- left = left + (oc - oa) * xdim
- elif c in string.uppercase:
- w = (oc - oA) * xdim
- self.rect(left, 0.0, w, self.height)
- left = left + w
-
-
-class I2of5(Barcode):
- """
- Interleaved 2 of 5 is a numeric-only barcode. It encodes an even
- number of digits; if an odd number is given, a 0 is prepended.
-
- Options that may be passed to constructor:
-
- value (int, or numeric string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
- Minumum is .0075 inch (7.5 mils).
-
- ratio (float, default 2.2):
- The ratio of wide elements to narrow elements.
- Must be between 2.0 and 3.0 (or 2.2 and 3.0 if the
- xdim is greater than 20 mils (.02 inch))
-
- gap (float or None, default None):
- width of intercharacter gap. None means "use xdim".
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- checksum (bool, default 1):
- Wether to compute and include the check digit
-
- bearers (float, in units of xdim. default 3.0):
- Height of bearer bars (horizontal bars along the top and
- bottom of the barcode). Default is 3 x-dimensions.
- Set to zero for no bearer bars. (Bearer bars help detect
- misscans, so it is suggested to leave them on).
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or .15 times the symbol's
- length.
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Interleaved 2 of 5:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/i_25.html
- http://www.adams1.com/pub/russadam/i25code.html
-
- Official Spec, "ANSI/AIM BC2-1995, USS" is available for US$45 from
- http://www.aimglobal.org/aimstore/
- """
-
- patterns = {
- 'start' : 'bsbs',
- 'stop' : 'Bsb',
-
- 'B0' : 'bbBBb', 'S0' : 'ssSSs',
- 'B1' : 'BbbbB', 'S1' : 'SsssS',
- 'B2' : 'bBbbB', 'S2' : 'sSssS',
- 'B3' : 'BBbbb', 'S3' : 'SSsss',
- 'B4' : 'bbBbB', 'S4' : 'ssSsS',
- 'B5' : 'BbBbb', 'S5' : 'SsSss',
- 'B6' : 'bBBbb', 'S6' : 'sSSss',
- 'B7' : 'bbbBB', 'S7' : 'sssSS',
- 'B8' : 'BbbBb', 'S8' : 'SssSs',
- 'B9' : 'bBbBb', 'S9' : 'sSsSs'
- }
-
- def __init__(self, value='', **args):
- self.height = None
- self.xdim = inch * 0.0075
- self.ratio = 2.2
- self.checksum = 1
- self.bearers = 3.0
- self.quiet = 1
- self.lquiet = self.rquiet = None
-
- if type(value) == type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = min(inch * 0.25, self.xdim * 10.0)
- self.rquiet = min(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- Barcode.__init__(self, value)
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in string.strip(self.value):
- if c not in string.digits:
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- s = self.validated
-
- # make sure result will be a multiple of 2 digits long,
- # checksum included
- if ((len(self.validated) % 2 == 0) and self.checksum) \
- or ((len(self.validated) % 2 == 1) and not self.checksum):
- s = '0' + s
-
- if self.checksum:
- c = 0
- cm = 3
-
- for d in s:
- c = c + cm * int(d)
- if cm == 3:
- cm = 1
- else:
- cm = 3
-
- d = 10 - (int(d) % 10)
- s = s + `d`
-
- self.encoded = s
-
- def decompose(self):
- dval = self.patterns['start']
-
- for i in range(0, len(self.encoded), 2):
- b = self.patterns['B' + self.encoded[i]]
- s = self.patterns['S' + self.encoded[i+1]]
-
- for i in range(0, len(b)):
- dval = dval + b[i] + s[i]
-
- self.decomposed = dval + self.patterns['stop']
- return self.decomposed
-
-
-
-class MSI(Barcode):
- """
- MSI is a numeric-only barcode.
-
- Options that may be passed to constructor:
-
- value (int, or numeric string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
-
- ratio (float, default 2.2):
- The ratio of wide elements to narrow elements.
-
- gap (float or None, default None):
- width of intercharacter gap. None means "use xdim".
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- checksum (bool, default 1):
- Wether to compute and include the check digit
-
- bearers (float, in units of xdim. default 0):
- Height of bearer bars (horizontal bars along the top and
- bottom of the barcode). Default is 0 (no bearers).
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or 10 xdims.
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on MSI Bar Code:
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/msi_code.html
- http://www.adams1.com/pub/russadam/plessy.html
- """
-
- patterns = {
- 'start' : 'Bs', 'stop' : 'bSb',
-
- '0' : 'bSbSbSbS', '1' : 'bSbSbSBs',
- '2' : 'bSbSBsbS', '3' : 'bSbSBsBs',
- '4' : 'bSBsbSbS', '5' : 'bSBsbSBs',
- '6' : 'bSBsBsbS', '7' : 'bSBsBsBs',
- '8' : 'BsbSbSbS', '9' : 'BsbSbSBs'
- }
-
- def __init__(self, value="", **args):
- self.height = None
- self.xdim = inch * 0.0075
- self.ratio = 2.2
- self.checksum = 1
- self.bearers = 0.0
- self.quiet = 1
- self.lquiet = self.rquiet = None
-
- if type(value) == type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = max(inch * 0.25, self.xdim * 10.0)
- self.rquiet = max(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- Barcode.__init__(self, value)
-
- def validate(self):
- vval = ""
- self.valid = 1
- for c in string.strip(self.value):
- if c not in string.digits:
- self.valid = 0
- continue
- vval = vval + c
- self.validated = vval
- return vval
-
- def encode(self):
- s = self.validated
-
- if self.checksum:
- c = ''
- for i in range(1, len(s), 2):
- c = c + s[i]
- d = str(int(c) * 2)
- t = 0
- for c in d:
- t = t + int(c)
- for i in range(0, len(s), 2):
- t = t + int(s[i])
- c = 10 - (t % 10)
-
- s = s + str(c)
-
- self.encoded = s
-
- def decompose(self):
- dval = self.patterns['start']
-
- for c in self.encoded:
- dval = dval + self.patterns[c]
-
- self.decomposed = dval + self.patterns['stop']
- return self.decomposed
-
-
-
-class Codabar(Barcode):
- """
- Codabar is a numeric plus some puntuation ("-$:/.+") barcode
- with four start/stop characters (A, B, C, and D).
-
- Options that may be passed to constructor:
-
- value (string. required.):
- The value to encode.
-
- xdim (float, default .0065):
- X-Dimension, or width of the smallest element
- minimum is 6.5 mils (.0065 inch)
-
- ratio (float, default 2.0):
- The ratio of wide elements to narrow elements.
-
- gap (float or None, default None):
- width of intercharacter gap. None means "use xdim".
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- checksum (bool, default 0):
- Wether to compute and include the check digit
-
- bearers (float, in units of xdim. default 0):
- Height of bearer bars (horizontal bars along the top and
- bottom of the barcode). Default is 0 (no bearers).
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or 10 xdim
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Codabar
-
- http://www.semiconductor.agilent.com/barcode/sg/Misc/codabar.html
- http://www.barcodeman.com/codabar.html
-
- Official Spec, "ANSI/AIM BC3-1995, USS" is available for US$45 from
- http://www.aimglobal.org/aimstore/
- """
-
- patterns = {
- '0': 'bsbsbSB', '1': 'bsbsBSb', '2': 'bsbSbsB',
- '3': 'BSbsbsb', '4': 'bsBsbSb', '5': 'BsbsbSb',
- '6': 'bSbsbsB', '7': 'bSbsBsb', '8': 'bSBsbsb',
- '9': 'BsbSbsb', '-': 'bsbSBsb', '$': 'bsBSbsb',
- ':': 'BsbsBsB', '/': 'BsBsbsB', '.': 'BsBsBsb',
- '+': 'bsBsBsB', 'A': 'bsBSbSb', 'B': 'bSbSbsB',
- 'C': 'bsbSbSB', 'D': 'bsbSBSb'
- }
-
- values = {
- '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4,
- '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9,
- '-' : 10, '$' : 11, ':' : 12, '/' : 13, '.' : 14,
- '+' : 15, 'A' : 16, 'B' : 17, 'C' : 18, 'D' : 19
- }
-
- chars = string.digits + "-$:/.+"
-
- def __init__(self, value='', **args):
- self.height = None
- self.xdim = inch * 0.0065
- self.ratio = 2.0 # XXX ?
- self.checksum = 0
- self.bearers = 0.0
- self.quiet = 1
- self.lquiet = self.rquiet = None
-
- if type(value) == type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = min(inch * 0.25, self.xdim * 10.0)
- self.rquiet = min(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- Barcode.__init__(self, value)
-
- def validate(self):
- vval = ""
- self.valid = 1
- s = string.strip(self.value)
- for i in range(0, len(s)):
- c = s[i]
- if c not in self.chars:
- if ((i != 0) and (i != len(s) - 1)) or (c not in 'ABCD'):
- self.Valid = 0
- continue
- vval = vval + c
-
- if vval[0] not in 'ABCD':
- vval = 'A' + vval
- if vval[-1] not in 'ABCD':
- vval = vval + vval[0]
-
- self.validated = vval
- return vval
-
- def encode(self):
- s = self.validated
-
- if self.checksum:
- v = 0
- for c in s:
- v = v + self.values[v]
- v = 16 - (v % 16)
- s = s + self.chars[v]
-
- self.encoded = s
-
- def decompose(self):
- dval = ""
- for c in self.encoded:
- dval = dval + self.patterns[c] + 'i'
- self.decomposed = dval[:-1]
- return self.decomposed
-
-
-
-class Code11(Barcode):
- """
- Code 11 is an almost-numeric barcode. It encodes the digits 0-9 plus
- dash ("-"). 11 characters total, hence the name.
-
- value (int or string. required.):
- The value to encode.
-
- xdim (float, default .0075):
- X-Dimension, or width of the smallest element
-
- ratio (float, default 2.2):
- The ratio of wide elements to narrow elements.
-
- gap (float or None, default None):
- width of intercharacter gap. None means "use xdim".
-
- height (float, see default below):
- Height of the symbol. Default is the height of the two
- bearer bars (if they exist) plus the greater of .25 inch
- or .15 times the symbol's length.
-
- checksum (0 none, 1 1-digit, 2 2-digit, -1 auto, default -1):
- How many checksum digits to include. -1 ("auto") means
- 1 if the number of digits is 10 or less, else 2.
-
- bearers (float, in units of xdim. default 0):
- Height of bearer bars (horizontal bars along the top and
- bottom of the barcode). Default is 0 (no bearers).
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- lquiet (float, see default below):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or 10 xdim
-
- rquiet (float, defaults as above):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of Information on Code 11:
-
- http://www.cwi.nl/people/dik/english/codes/barcodes.html
- """
-
- chars = string.digits + '-'
-
- patterns = {
- '0' : 'bsbsB', '1' : 'BsbsB', '2' : 'bSbsB',
- '3' : 'BSbsb', '4' : 'bsBsB', '5' : 'BsBsb',
- '6' : 'bSBsb', '7' : 'bsbSB', '8' : 'BsbSb',
- '9' : 'Bsbsb', '-' : 'bsBsb', 'S' : 'bsBSb' # Start/Stop
- }
-
- values = {
- '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4,
- '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9,
- '-' : 10,
- }
-
- def __init__(self, value='', **args):
- self.height = None
- self.xdim = inch * 0.0075
- self.ratio = 2.2 # XXX ?
- self.checksum = -1 # Auto
- self.bearers = 0.0
- self.quiet = 1
- self.lquiet = self.rquiet = None
-
- if type(value) == type(1):
- value = str(value)
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- if self.quiet:
- if self.lquiet is None:
- self.lquiet = min(inch * 0.25, self.xdim * 10.0)
- self.rquiet = min(inch * 0.25, self.xdim * 10.0)
- else:
- self.lquiet = self.rquiet = 0.0
-
- Barcode.__init__(self, value)
-
- def validate(self):
- vval = ""
- self.valid = 1
- s = string.strip(self.value)
- for i in range(0, len(s)):
- c = s[i]
- if c not in self.chars:
- self.Valid = 0
- continue
- vval = vval + c
-
- self.validated = vval
- return vval
-
- def encode(self):
- s = self.validated
-
- if self.checksum == -1:
- if len(s) <= 10:
- self.checksum = 1
- else:
- self.checksum = 2
-
- if self.checksum > 0:
- # compute first checksum
- i = 0; v = 1; c = 0
- while i < len(s):
- c = c + v * string.index(self.chars, s[-(i+1)])
- i = i + 1; v = v + 1
- if v > 10:
- v = 1
- s = s + self.chars[c % 11]
-
- if self.checksum > 1:
- # compute second checksum
- i = 0; v = 1; c = 0
- while i < len(s):
- c = c + v * string.index(self.chars, s[-(i+1)])
- i = i + 1; v = v + 1
- if v > 9:
- v = 1
- s = s + self.chars[c % 10]
-
- self.encoded = 'S' + s + 'S'
-
- def decompose(self):
- dval = ""
- for c in self.encoded:
- dval = dval + self.patterns[c] + 'i'
- self.decomposed = dval[:-1]
- return self.decomposed
+# -*- coding: utf-8 -*- +# +# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Tyler C. Sarna. +# 4. Neither the name of the author nor the names of contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +from reportlab.platypus.flowables import Flowable +from reportlab.lib.units import inch +import string + +class Barcode(Flowable): + """Abstract Base for barcodes. Includes implementations of + some methods suitable for the more primitive barcode types""" + + def __init__(self, value = ''): + self.value = value + + if not hasattr(self, 'gap'): + self.gap = None + + self.validate() + self.encode() + #print self.encoded + self.decompose() + #print self.decomposed + self.computeSize() + + def validate(self): + self.valid = 1 + self.validated = self.value + + def encode(self): + self.encoded = self.validated + + def decompose(self): + self.decomposed = self.encoded + + def computeSize(self, *args): + xdim = self.xdim + wx = xdim * self.ratio + + if self.gap == None: + self.gap = xdim + + w = 0.0 + + for c in self.decomposed: + if c in 'sb': + w = w + xdim + elif c in 'SB': + w = w + wx + else: # 'i' + w = w + self.gap + + if self.height is None: + self.height = w * 0.15 + self.height = max(0.25 * inch, self.height) + if self.bearers: + self.height = self.height + self.bearers * 2.0 * xdim + + if self.quiet: + w = w + self.lquiet + self.rquiet + self.xo = self.lquiet + else: + self.xo = 0.0 + + self.width = w + + def draw(self): + xdim = self.xdim + wx = xdim * self.ratio + + left = self.xo + b = self.bearers * xdim + bb = b * 0.5 + tb = self.height - (b * 1.5) + + for c in self.decomposed: + if c == 'i': + left = left + self.gap + elif c == 's': + left = left + xdim + elif c == 'S': + left = left + wx + elif c == 'b': + self.rect(left, bb, xdim, tb) + left = left + xdim + elif c == 'B': + self.rect(left, bb, wx, tb) + left = left + wx + + if self.bearers: + self.rect(self.lquiet, 0.0, \ + self.width - (self.lquiet + self.rquiet), b) + self.rect(self.lquiet, self.height - b, \ + self.width - (self.lquiet + self.rquiet), b) + + def rect(self, x, y, w, h): + self.canv.rect(x, y, w, h, stroke=0, fill=1) + + +class MultiWidthBarcode(Barcode): + """Base for variable-bar-width codes like Code93 and Code128""" + + def computeSize(self, *args): + xdim = self.xdim + oa, oA = ord('a') - 1, ord('A') - 1 + + w = 0.0 + + for c in self.decomposed: + oc = ord(c) + if c in string.lowercase: + w = w + xdim * (oc - oa) + elif c in string.uppercase: + w = w + xdim * (oc - oA) + + if self.height is None: + self.height = w * 0.15 + self.height = max(0.25 * inch, self.height) + + if self.quiet: + w = w + self.lquiet + self.rquiet + self.xo = self.lquiet + else: + self.xo = 0.0 + + self.width = w + + def draw(self): + oa, oA = ord('a') - 1, ord('A') - 1 + xdim = self.xdim + left = self.xo + + for c in self.decomposed: + oc = ord(c) + if c in string.lowercase: + left = left + (oc - oa) * xdim + elif c in string.uppercase: + w = (oc - oA) * xdim + self.rect(left, 0.0, w, self.height) + left = left + w + + +class I2of5(Barcode): + """ + Interleaved 2 of 5 is a numeric-only barcode. It encodes an even + number of digits; if an odd number is given, a 0 is prepended. + + Options that may be passed to constructor: + + value (int, or numeric string. required.): + The value to encode. + + xdim (float, default .0075): + X-Dimension, or width of the smallest element + Minumum is .0075 inch (7.5 mils). + + ratio (float, default 2.2): + The ratio of wide elements to narrow elements. + Must be between 2.0 and 3.0 (or 2.2 and 3.0 if the + xdim is greater than 20 mils (.02 inch)) + + gap (float or None, default None): + width of intercharacter gap. None means "use xdim". + + height (float, see default below): + Height of the symbol. Default is the height of the two + bearer bars (if they exist) plus the greater of .25 inch + or .15 times the symbol's length. + + checksum (bool, default 1): + Wether to compute and include the check digit + + bearers (float, in units of xdim. default 3.0): + Height of bearer bars (horizontal bars along the top and + bottom of the barcode). Default is 3 x-dimensions. + Set to zero for no bearer bars. (Bearer bars help detect + misscans, so it is suggested to leave them on). + + quiet (bool, default 1): + Wether to include quiet zones in the symbol. + + lquiet (float, see default below): + Quiet zone size to left of code, if quiet is true. + Default is the greater of .25 inch, or .15 times the symbol's + length. + + rquiet (float, defaults as above): + Quiet zone size to right left of code, if quiet is true. + + Sources of Information on Interleaved 2 of 5: + + http://www.semiconductor.agilent.com/barcode/sg/Misc/i_25.html + http://www.adams1.com/pub/russadam/i25code.html + + Official Spec, "ANSI/AIM BC2-1995, USS" is available for US$45 from + http://www.aimglobal.org/aimstore/ + """ + + patterns = { + 'start' : 'bsbs', + 'stop' : 'Bsb', + + 'B0' : 'bbBBb', 'S0' : 'ssSSs', + 'B1' : 'BbbbB', 'S1' : 'SsssS', + 'B2' : 'bBbbB', 'S2' : 'sSssS', + 'B3' : 'BBbbb', 'S3' : 'SSsss', + 'B4' : 'bbBbB', 'S4' : 'ssSsS', + 'B5' : 'BbBbb', 'S5' : 'SsSss', + 'B6' : 'bBBbb', 'S6' : 'sSSss', + 'B7' : 'bbbBB', 'S7' : 'sssSS', + 'B8' : 'BbbBb', 'S8' : 'SssSs', + 'B9' : 'bBbBb', 'S9' : 'sSsSs' + } + + def __init__(self, value='', **args): + self.height = None + self.xdim = inch * 0.0075 + self.ratio = 2.2 + self.checksum = 1 + self.bearers = 3.0 + self.quiet = 1 + self.lquiet = self.rquiet = None + + if type(value) == type(1): + value = str(value) + + for (k, v) in args.items(): + setattr(self, k, v) + + if self.quiet: + if self.lquiet is None: + self.lquiet = min(inch * 0.25, self.xdim * 10.0) + self.rquiet = min(inch * 0.25, self.xdim * 10.0) + else: + self.lquiet = self.rquiet = 0.0 + + Barcode.__init__(self, value) + + def validate(self): + vval = "" + self.valid = 1 + for c in string.strip(self.value): + if c not in string.digits: + self.valid = 0 + continue + vval = vval + c + self.validated = vval + return vval + + def encode(self): + s = self.validated + + # make sure result will be a multiple of 2 digits long, + # checksum included + if ((len(self.validated) % 2 == 0) and self.checksum) \ + or ((len(self.validated) % 2 == 1) and not self.checksum): + s = '0' + s + + if self.checksum: + c = 0 + cm = 3 + + for d in s: + c = c + cm * int(d) + if cm == 3: + cm = 1 + else: + cm = 3 + + d = 10 - (int(d) % 10) + s = s + `d` + + self.encoded = s + + def decompose(self): + dval = self.patterns['start'] + + for i in range(0, len(self.encoded), 2): + b = self.patterns['B' + self.encoded[i]] + s = self.patterns['S' + self.encoded[i+1]] + + for i in range(0, len(b)): + dval = dval + b[i] + s[i] + + self.decomposed = dval + self.patterns['stop'] + return self.decomposed + + + +class MSI(Barcode): + """ + MSI is a numeric-only barcode. + + Options that may be passed to constructor: + + value (int, or numeric string. required.): + The value to encode. + + xdim (float, default .0075): + X-Dimension, or width of the smallest element + + ratio (float, default 2.2): + The ratio of wide elements to narrow elements. + + gap (float or None, default None): + width of intercharacter gap. None means "use xdim". + + height (float, see default below): + Height of the symbol. Default is the height of the two + bearer bars (if they exist) plus the greater of .25 inch + or .15 times the symbol's length. + + checksum (bool, default 1): + Wether to compute and include the check digit + + bearers (float, in units of xdim. default 0): + Height of bearer bars (horizontal bars along the top and + bottom of the barcode). Default is 0 (no bearers). + + lquiet (float, see default below): + Quiet zone size to left of code, if quiet is true. + Default is the greater of .25 inch, or 10 xdims. + + rquiet (float, defaults as above): + Quiet zone size to right left of code, if quiet is true. + + Sources of Information on MSI Bar Code: + + http://www.semiconductor.agilent.com/barcode/sg/Misc/msi_code.html + http://www.adams1.com/pub/russadam/plessy.html + """ + + patterns = { + 'start' : 'Bs', 'stop' : 'bSb', + + '0' : 'bSbSbSbS', '1' : 'bSbSbSBs', + '2' : 'bSbSBsbS', '3' : 'bSbSBsBs', + '4' : 'bSBsbSbS', '5' : 'bSBsbSBs', + '6' : 'bSBsBsbS', '7' : 'bSBsBsBs', + '8' : 'BsbSbSbS', '9' : 'BsbSbSBs' + } + + def __init__(self, value="", **args): + self.height = None + self.xdim = inch * 0.0075 + self.ratio = 2.2 + self.checksum = 1 + self.bearers = 0.0 + self.quiet = 1 + self.lquiet = self.rquiet = None + + if type(value) == type(1): + value = str(value) + + for (k, v) in args.items(): + setattr(self, k, v) + + if self.quiet: + if self.lquiet is None: + self.lquiet = max(inch * 0.25, self.xdim * 10.0) + self.rquiet = max(inch * 0.25, self.xdim * 10.0) + else: + self.lquiet = self.rquiet = 0.0 + + Barcode.__init__(self, value) + + def validate(self): + vval = "" + self.valid = 1 + for c in string.strip(self.value): + if c not in string.digits: + self.valid = 0 + continue + vval = vval + c + self.validated = vval + return vval + + def encode(self): + s = self.validated + + if self.checksum: + c = '' + for i in range(1, len(s), 2): + c = c + s[i] + d = str(int(c) * 2) + t = 0 + for c in d: + t = t + int(c) + for i in range(0, len(s), 2): + t = t + int(s[i]) + c = 10 - (t % 10) + + s = s + str(c) + + self.encoded = s + + def decompose(self): + dval = self.patterns['start'] + + for c in self.encoded: + dval = dval + self.patterns[c] + + self.decomposed = dval + self.patterns['stop'] + return self.decomposed + + + +class Codabar(Barcode): + """ + Codabar is a numeric plus some puntuation ("-$:/.+") barcode + with four start/stop characters (A, B, C, and D). + + Options that may be passed to constructor: + + value (string. required.): + The value to encode. + + xdim (float, default .0065): + X-Dimension, or width of the smallest element + minimum is 6.5 mils (.0065 inch) + + ratio (float, default 2.0): + The ratio of wide elements to narrow elements. + + gap (float or None, default None): + width of intercharacter gap. None means "use xdim". + + height (float, see default below): + Height of the symbol. Default is the height of the two + bearer bars (if they exist) plus the greater of .25 inch + or .15 times the symbol's length. + + checksum (bool, default 0): + Wether to compute and include the check digit + + bearers (float, in units of xdim. default 0): + Height of bearer bars (horizontal bars along the top and + bottom of the barcode). Default is 0 (no bearers). + + quiet (bool, default 1): + Wether to include quiet zones in the symbol. + + lquiet (float, see default below): + Quiet zone size to left of code, if quiet is true. + Default is the greater of .25 inch, or 10 xdim + + rquiet (float, defaults as above): + Quiet zone size to right left of code, if quiet is true. + + Sources of Information on Codabar + + http://www.semiconductor.agilent.com/barcode/sg/Misc/codabar.html + http://www.barcodeman.com/codabar.html + + Official Spec, "ANSI/AIM BC3-1995, USS" is available for US$45 from + http://www.aimglobal.org/aimstore/ + """ + + patterns = { + '0': 'bsbsbSB', '1': 'bsbsBSb', '2': 'bsbSbsB', + '3': 'BSbsbsb', '4': 'bsBsbSb', '5': 'BsbsbSb', + '6': 'bSbsbsB', '7': 'bSbsBsb', '8': 'bSBsbsb', + '9': 'BsbSbsb', '-': 'bsbSBsb', '$': 'bsBSbsb', + ':': 'BsbsBsB', '/': 'BsBsbsB', '.': 'BsBsBsb', + '+': 'bsBsBsB', 'A': 'bsBSbSb', 'B': 'bSbSbsB', + 'C': 'bsbSbSB', 'D': 'bsbSBSb' + } + + values = { + '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4, + '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9, + '-' : 10, '$' : 11, ':' : 12, '/' : 13, '.' : 14, + '+' : 15, 'A' : 16, 'B' : 17, 'C' : 18, 'D' : 19 + } + + chars = string.digits + "-$:/.+" + + def __init__(self, value='', **args): + self.height = None + self.xdim = inch * 0.0065 + self.ratio = 2.0 # XXX ? + self.checksum = 0 + self.bearers = 0.0 + self.quiet = 1 + self.lquiet = self.rquiet = None + + if type(value) == type(1): + value = str(value) + + for (k, v) in args.items(): + setattr(self, k, v) + + if self.quiet: + if self.lquiet is None: + self.lquiet = min(inch * 0.25, self.xdim * 10.0) + self.rquiet = min(inch * 0.25, self.xdim * 10.0) + else: + self.lquiet = self.rquiet = 0.0 + + Barcode.__init__(self, value) + + def validate(self): + vval = "" + self.valid = 1 + s = string.strip(self.value) + for i in range(0, len(s)): + c = s[i] + if c not in self.chars: + if ((i != 0) and (i != len(s) - 1)) or (c not in 'ABCD'): + self.Valid = 0 + continue + vval = vval + c + + if vval[0] not in 'ABCD': + vval = 'A' + vval + if vval[-1] not in 'ABCD': + vval = vval + vval[0] + + self.validated = vval + return vval + + def encode(self): + s = self.validated + + if self.checksum: + v = 0 + for c in s: + v = v + self.values[v] + v = 16 - (v % 16) + s = s + self.chars[v] + + self.encoded = s + + def decompose(self): + dval = "" + for c in self.encoded: + dval = dval + self.patterns[c] + 'i' + self.decomposed = dval[:-1] + return self.decomposed + + + +class Code11(Barcode): + """ + Code 11 is an almost-numeric barcode. It encodes the digits 0-9 plus + dash ("-"). 11 characters total, hence the name. + + value (int or string. required.): + The value to encode. + + xdim (float, default .0075): + X-Dimension, or width of the smallest element + + ratio (float, default 2.2): + The ratio of wide elements to narrow elements. + + gap (float or None, default None): + width of intercharacter gap. None means "use xdim". + + height (float, see default below): + Height of the symbol. Default is the height of the two + bearer bars (if they exist) plus the greater of .25 inch + or .15 times the symbol's length. + + checksum (0 none, 1 1-digit, 2 2-digit, -1 auto, default -1): + How many checksum digits to include. -1 ("auto") means + 1 if the number of digits is 10 or less, else 2. + + bearers (float, in units of xdim. default 0): + Height of bearer bars (horizontal bars along the top and + bottom of the barcode). Default is 0 (no bearers). + + quiet (bool, default 1): + Wether to include quiet zones in the symbol. + + lquiet (float, see default below): + Quiet zone size to left of code, if quiet is true. + Default is the greater of .25 inch, or 10 xdim + + rquiet (float, defaults as above): + Quiet zone size to right left of code, if quiet is true. + + Sources of Information on Code 11: + + http://www.cwi.nl/people/dik/english/codes/barcodes.html + """ + + chars = string.digits + '-' + + patterns = { + '0' : 'bsbsB', '1' : 'BsbsB', '2' : 'bSbsB', + '3' : 'BSbsb', '4' : 'bsBsB', '5' : 'BsBsb', + '6' : 'bSBsb', '7' : 'bsbSB', '8' : 'BsbSb', + '9' : 'Bsbsb', '-' : 'bsBsb', 'S' : 'bsBSb' # Start/Stop + } + + values = { + '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4, + '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9, + '-' : 10, + } + + def __init__(self, value='', **args): + self.height = None + self.xdim = inch * 0.0075 + self.ratio = 2.2 # XXX ? + self.checksum = -1 # Auto + self.bearers = 0.0 + self.quiet = 1 + self.lquiet = self.rquiet = None + + if type(value) == type(1): + value = str(value) + + for (k, v) in args.items(): + setattr(self, k, v) + + if self.quiet: + if self.lquiet is None: + self.lquiet = min(inch * 0.25, self.xdim * 10.0) + self.rquiet = min(inch * 0.25, self.xdim * 10.0) + else: + self.lquiet = self.rquiet = 0.0 + + Barcode.__init__(self, value) + + def validate(self): + vval = "" + self.valid = 1 + s = string.strip(self.value) + for i in range(0, len(s)): + c = s[i] + if c not in self.chars: + self.Valid = 0 + continue + vval = vval + c + + self.validated = vval + return vval + + def encode(self): + s = self.validated + + if self.checksum == -1: + if len(s) <= 10: + self.checksum = 1 + else: + self.checksum = 2 + + if self.checksum > 0: + # compute first checksum + i = 0; v = 1; c = 0 + while i < len(s): + c = c + v * string.index(self.chars, s[-(i+1)]) + i = i + 1; v = v + 1 + if v > 10: + v = 1 + s = s + self.chars[c % 11] + + if self.checksum > 1: + # compute second checksum + i = 0; v = 1; c = 0 + while i < len(s): + c = c + v * string.index(self.chars, s[-(i+1)]) + i = i + 1; v = v + 1 + if v > 9: + v = 1 + s = s + self.chars[c % 10] + + self.encoded = 'S' + s + 'S' + + def decompose(self): + dval = "" + for c in self.encoded: + dval = dval + self.patterns[c] + 'i' + self.decomposed = dval[:-1] + return self.decomposed # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auction/barcode/fourstate.py b/addons/auction/barcode/fourstate.py index b83e7378f9b..831c878b9d1 100644 --- a/addons/auction/barcode/fourstate.py +++ b/addons/auction/barcode/fourstate.py @@ -1,82 +1,83 @@ -#
-# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.lib.units import inch
-from common import Barcode
-import string
-
-# . 3 T Tracker
-# , 2 D Descender
-# ' 1 A Ascender
-# | 0 H Ascender/Descender
-
-_rm_patterns = {
- "0" : "--||", "1" : "-',|", "2" : "-'|,", "3" : "'-,|",
- "4" : "'-|,", "5" : "'',,", "6" : "-,'|", "7" : "-|-|",
- "8" : "-|',", "9" : "',-|", "A" : "',',", "B" : "'|-,",
- "C" : "-,|'", "D" : "-|,'", "E" : "-||-", "F" : "',,'",
- "G" : "',|-", "H" : "'|,-", "I" : ",-'|", "J" : ",'-|",
- "K" : ",'',", "L" : "|--|", "M" : "|-',", "N" : "|'-,",
- "O" : ",-|'", "P" : ",','", "Q" : ",'|-", "R" : "|-,'",
- "S" : "|-|-", "T" : "|',-", "U" : ",,''", "V" : ",|-'",
- "W" : ",|'-", "X" : "|,-'", "Y" : "|,'-", "Z" : "||--",
-
- # start, stop
- "(" : "'-,'", ")" : "'|,|"
-}
-
-_ozN_patterns = {
- "0" : "||", "1" : "|'", "2" : "|,", "3" : "'|", "4" : "''",
- "5" : "',", "6" : ",|", "7" : ",'", "8" : ",,", "9" : ".|"
-}
-
-_ozC_patterns = {
- "A" : "|||", "B" : "||'", "C" : "||,", "D" : "|'|",
- "E" : "|''", "F" : "|',", "G" : "|,|", "H" : "|,'",
- "I" : "|,,", "J" : "'||", "K" : "'|'", "L" : "'|,",
- "M" : "''|", "N" : "'''", "O" : "'',", "P" : "',|",
- "Q" : "','", "R" : "',,", "S" : ",||", "T" : ",|'",
- "U" : ",|,", "V" : ",'|", "W" : ",''", "X" : ",',",
- "Y" : ",,|", "Z" : ",,'", "a" : "|,.", "b" : "|.|",
- "c" : "|.'", "d" : "|.,", "e" : "|..", "f" : "'|.",
- "g" : "''.", "h" : "',.", "i" : "'.|", "j" : "'.'",
- "k" : "'.,", "l" : "'..", "m" : ",|.", "n" : ",'.",
- "o" : ",,.", "p" : ",.|", "q" : ",.'", "r" : ",.,",
- "s" : ",..", "t" : ".|.", "u" : ".'.", "v" : ".,.",
- "w" : "..|", "x" : "..'", "y" : "..,", "z" : "...",
- "0" : ",,,", "1" : ".||", "2" : ".|'", "3" : ".|,",
- "4" : ".'|", "5" : ".''", "6" : ".',", "7" : ".,|",
- "8" : ".,'", "9" : ".,,", " " : "||.", "#" : "|'.",
-}
-
-#http://www.auspost.com.au/futurepost/
+# -*- coding: utf-8 -*- +# +# Copyright (c) 2000 Tyler C. Sarna <tsarna@sarna.org> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Tyler C. Sarna. +# 4. Neither the name of the author nor the names of contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +from reportlab.lib.units import inch +from common import Barcode +import string + +# . 3 T Tracker +# , 2 D Descender +# ' 1 A Ascender +# | 0 H Ascender/Descender + +_rm_patterns = { + "0" : "--||", "1" : "-',|", "2" : "-'|,", "3" : "'-,|", + "4" : "'-|,", "5" : "'',,", "6" : "-,'|", "7" : "-|-|", + "8" : "-|',", "9" : "',-|", "A" : "',',", "B" : "'|-,", + "C" : "-,|'", "D" : "-|,'", "E" : "-||-", "F" : "',,'", + "G" : "',|-", "H" : "'|,-", "I" : ",-'|", "J" : ",'-|", + "K" : ",'',", "L" : "|--|", "M" : "|-',", "N" : "|'-,", + "O" : ",-|'", "P" : ",','", "Q" : ",'|-", "R" : "|-,'", + "S" : "|-|-", "T" : "|',-", "U" : ",,''", "V" : ",|-'", + "W" : ",|'-", "X" : "|,-'", "Y" : "|,'-", "Z" : "||--", + + # start, stop + "(" : "'-,'", ")" : "'|,|" +} + +_ozN_patterns = { + "0" : "||", "1" : "|'", "2" : "|,", "3" : "'|", "4" : "''", + "5" : "',", "6" : ",|", "7" : ",'", "8" : ",,", "9" : ".|" +} + +_ozC_patterns = { + "A" : "|||", "B" : "||'", "C" : "||,", "D" : "|'|", + "E" : "|''", "F" : "|',", "G" : "|,|", "H" : "|,'", + "I" : "|,,", "J" : "'||", "K" : "'|'", "L" : "'|,", + "M" : "''|", "N" : "'''", "O" : "'',", "P" : "',|", + "Q" : "','", "R" : "',,", "S" : ",||", "T" : ",|'", + "U" : ",|,", "V" : ",'|", "W" : ",''", "X" : ",',", + "Y" : ",,|", "Z" : ",,'", "a" : "|,.", "b" : "|.|", + "c" : "|.'", "d" : "|.,", "e" : "|..", "f" : "'|.", + "g" : "''.", "h" : "',.", "i" : "'.|", "j" : "'.'", + "k" : "'.,", "l" : "'..", "m" : ",|.", "n" : ",'.", + "o" : ",,.", "p" : ",.|", "q" : ",.'", "r" : ",.,", + "s" : ",..", "t" : ".|.", "u" : ".'.", "v" : ".,.", + "w" : "..|", "x" : "..'", "y" : "..,", "z" : "...", + "0" : ",,,", "1" : ".||", "2" : ".|'", "3" : ".|,", + "4" : ".'|", "5" : ".''", "6" : ".',", "7" : ".,|", + "8" : ".,'", "9" : ".,,", " " : "||.", "#" : "|'.", +} + +#http://www.auspost.com.au/futurepost/ # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auction/barcode/test.py b/addons/auction/barcode/test.py index 93a8c2e6d9c..135f4ae2641 100644 --- a/addons/auction/barcode/test.py +++ b/addons/auction/barcode/test.py @@ -1,56 +1,57 @@ -#!/usr/bin/python
-from common import *
-from code39 import *
-from code93 import *
-from code128 import *
-from usps import *
-
-from reportlab.pdfgen.canvas import Canvas
-from reportlab.lib.styles import getSampleStyleSheet
-from reportlab.platypus import Paragraph, Frame
-from reportlab.platypus.flowables import XBox
-def run():
- styles = getSampleStyleSheet()
- styleN = styles['Normal']
- styleH = styles['Heading1']
- story = []
-
- story.append(Paragraph('I2of5', styleN))
- story.append(I2of5(1234, xdim = inch*0.02, checksum=0))
- story.append(Paragraph('MSI', styleN))
- story.append(MSI(1234, xdim = inch*0.02))
- story.append(Paragraph('Codabar', styleN))
- story.append(Codabar("A012345B", xdim = inch*0.02))
- story.append(Paragraph('Code 11', styleN))
- story.append(Code11("01234545634563"))
- story.append(Paragraph('Code 39', styleN))
- story.append(Standard39("A012345B%R"))
- story.append(Paragraph('Extended Code 39', styleN))
- story.append(Extended39("A012345B}"))
- story.append(Paragraph('Code93', styleN))
- story.append(Standard93("CODE 93"))
- story.append(Paragraph('Extended Code93', styleN))
- story.append(Extended93("L@@K! Code 93 :-)")) #, xdim=0.005 * inch))
- story.append(Paragraph('Code 128', styleN))
- c=Code128("AB-12345678") #, xdim=0.005 * inch)
- #print 'WIDTH =', (c.width / inch), 'XDIM =', (c.xdim / inch)
- #print 'LQ =', (c.lquiet / inch), 'RQ =', (c.rquiet / inch)
- story.append(c)
- story.append(Paragraph('USPS FIM', styleN))
- story.append(FIM("A"))
- story.append(Paragraph('USPS POSTNET', styleN))
- story.append(POSTNET('78247-1043'))
- story.append(Paragraph('Label Size', styleN))
- story.append(XBox((2.0 + 5.0/8.0)*inch, 1 * inch, '1x2-5/8"'))
- story.append(Paragraph('Label Size', styleN))
- story.append(XBox((1.75)*inch, .5 * inch, '1/2x1-3/4"'))
- c = Canvas('out.pdf')
- f = Frame(inch, inch, 6*inch, 9*inch, showBoundary=1)
- f.addFromList(story, c)
- c.save()
-
-if __name__=='__main__':
- run()
-
-
+# -*- coding: utf-8 -*- +#!/usr/bin/python +from common import * +from code39 import * +from code93 import * +from code128 import * +from usps import * + +from reportlab.pdfgen.canvas import Canvas +from reportlab.lib.styles import getSampleStyleSheet +from reportlab.platypus import Paragraph, Frame +from reportlab.platypus.flowables import XBox +def run(): + styles = getSampleStyleSheet() + styleN = styles['Normal'] + styleH = styles['Heading1'] + story = [] + + story.append(Paragraph('I2of5', styleN)) + story.append(I2of5(1234, xdim = inch*0.02, checksum=0)) + story.append(Paragraph('MSI', styleN)) + story.append(MSI(1234, xdim = inch*0.02)) + story.append(Paragraph('Codabar', styleN)) + story.append(Codabar("A012345B", xdim = inch*0.02)) + story.append(Paragraph('Code 11', styleN)) + story.append(Code11("01234545634563")) + story.append(Paragraph('Code 39', styleN)) + story.append(Standard39("A012345B%R")) + story.append(Paragraph('Extended Code 39', styleN)) + story.append(Extended39("A012345B}")) + story.append(Paragraph('Code93', styleN)) + story.append(Standard93("CODE 93")) + story.append(Paragraph('Extended Code93', styleN)) + story.append(Extended93("L@@K! Code 93 :-)")) #, xdim=0.005 * inch)) + story.append(Paragraph('Code 128', styleN)) + c=Code128("AB-12345678") #, xdim=0.005 * inch) + #print 'WIDTH =', (c.width / inch), 'XDIM =', (c.xdim / inch) + #print 'LQ =', (c.lquiet / inch), 'RQ =', (c.rquiet / inch) + story.append(c) + story.append(Paragraph('USPS FIM', styleN)) + story.append(FIM("A")) + story.append(Paragraph('USPS POSTNET', styleN)) + story.append(POSTNET('78247-1043')) + story.append(Paragraph('Label Size', styleN)) + story.append(XBox((2.0 + 5.0/8.0)*inch, 1 * inch, '1x2-5/8"')) + story.append(Paragraph('Label Size', styleN)) + story.append(XBox((1.75)*inch, .5 * inch, '1/2x1-3/4"')) + c = Canvas('out.pdf') + f = Frame(inch, inch, 6*inch, 9*inch, showBoundary=1) + f.addFromList(story, c) + c.save() + +if __name__=='__main__': + run() + + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auction/barcode/usps.py b/addons/auction/barcode/usps.py index 1dc2e89d91e..9235f42a1ce 100644 --- a/addons/auction/barcode/usps.py +++ b/addons/auction/barcode/usps.py @@ -1,232 +1,233 @@ -#
-# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org>
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. All advertising materials mentioning features or use of this software
-# must display the following acknowledgement:
-# This product includes software developed by Tyler C. Sarna.
-# 4. Neither the name of the author nor the names of contributors
-# may be used to endorse or promote products derived from this software
-# without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-#
-
-from reportlab.lib.units import inch
-from common import Barcode
-import string
-
-_fim_patterns = {
- 'A' : "|| | ||",
- 'B' : "| || || |",
- 'C' : "|| | | ||",
- 'D' : "||| | |||",
- # XXX There is an E.
- # The below has been seen, but dunno if it is E or not:
- # 'E' : '|||| ||||'
-}
-
-_postnet_patterns = {
- '1' : "...||", '2' : "..|.|", '3' : "..||.", '4' : ".|..|",
- '5' : ".|.|.", '6' : ".||..", '7' : "|...|", '8' : "|..|.",
- '9' : "|.|..", '0' : "||...", 'S' : "|",
-}
-
-
-class FIM(Barcode):
- """"
- FIM (Facing ID Marks) encode only one letter.
- There are currently four defined:
-
- A Courtesy reply mail with pre-printed POSTNET
- B Business reply mail without pre-printed POSTNET
- C Business reply mail with pre-printed POSTNET
- D OCR Readable mail without pre-printed POSTNET
-
- Interleaved 2 of 5 is a numeric-only barcode. It encodes an even
- number of digits; if an odd number is given, a 0 is prepended.
-
- Options that may be passed to constructor:
-
- value (single character string from the set A - D. required.):
- The value to encode.
-
- quiet (bool, default 1):
- Wether to include quiet zones in the symbol.
-
- The following may also be passed, but doing so will generate nonstandard
- symbols which should not be used. This is mainly documented here to
- show the defaults:
-
- height (float, default 5/8 inch):
- Height of the code. This might legitimately be overriden to make
- a taller symbol that will 'bleed' off the edge of the paper,
- leaving 5/8 inch remaining.
-
- lquiet (float, default 1/4 inch):
- Quiet zone size to left of code, if quiet is true.
- Default is the greater of .25 inch, or .15 times the symbol's
- length.
-
- rquiet (float, default 15/32 inch):
- Quiet zone size to right left of code, if quiet is true.
-
- Sources of information on FIM:
-
- USPS Publication 25, A Guide to Business Mail Preparation
- http://new.usps.com/cpim/ftp/pubs/pub25.pdf
- """
-
- def __init__(self, value='', **args):
- self.barwidth = inch * (1.0/32.0)
- self.barspace = inch * (1.0/16.0)
- self.height = inch * (5.0/8.0)
- self.rquiet = inch * (0.25)
- self.lquiet = inch * (15.0/32.0)
- self.quiet = 0
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- Barcode.__init__(self, value)
-
- def validate(self):
- self.valid = 1
- self.validated = ''
- for c in self.value:
- if c in string.whitespace:
- continue
- elif c in "abcdABCD":
- self.validated = self.validated + string.upper(c)
- else:
- self.valid = 0
-
- if len(self.validated) != 1:
- raise ValueError, "Input must be exactly one character"
-
- return self.validated
-
- def decompose(self):
- self.decomposed = ''
- for c in self.encoded:
- self.decomposed = self.decomposed + _fim_patterns[c]
-
- return self.decomposed
-
- def computeSize(self):
- self.width = (len(self.decomposed) - 1) * self.barspace + self.barwidth
- if self.quiet:
- self.xo = self.lquiet
- self.width = self.lquiet + self.width + self.rquiet
- else:
- self.xo = 0.0
-
- def draw(self):
- left = self.xo
- for c in self.decomposed:
- if c == '|':
- self.rect(left, 0.0, self.barwidth, self.height)
- left = left + self.barspace
-
-
-class POSTNET(Barcode):
- """"
- POSTNET is used in the US to encode "zip codes" (postal codes) on
- mail. It can encode 5, 9, or 11 digit codes. I've read that it's
- pointless to do 5 digits, since USPS will just have to re-print
- them with 9 or 11 digits.
-
- Sources of information on POSTNET:
-
- USPS Publication 25, A Guide to Business Mail Preparation
- http://new.usps.com/cpim/ftp/pubs/pub25.pdf
- """
-
- def __init__(self, value='', **args):
- self.sbarheight = inch * 0.050
- self.fbarheight = inch * 0.125
- self.barwide = inch * 0.018
- self.spacewide = inch * 0.0275
-
- for (k, v) in args.items():
- setattr(self, k, v)
-
- Barcode.__init__(self, value)
-
- def validate(self):
- self.validated = ''
- self.valid = 1
- count = 0
- for c in self.value:
- if c in (string.whitespace + '-'):
- pass
- elif c in string.digits:
- count = count + 1
- if count == 6:
- self.validated = self.validated + '-'
- self.validated = self.validated + c
- else:
- self.valid = 0
-
- if len(self.validated) not in [5, 10, 12]:
- self.valid = 0
-
- return self.validated
-
- def encode(self):
- self.encoded = "S"
- check = 0
- for c in self.validated:
- if c in string.digits:
- self.encoded = self.encoded + c
- check = check + string.atoi(c)
- elif c == '-':
- pass
- else:
- raise ValueError, "Invalid character in input"
- check = (10 - (check % 10)) % 10
- self.encoded = self.encoded + `check` + 'S'
- return self.encoded
-
- def decompose(self):
- self.decomposed = ''
- for c in self.encoded:
- self.decomposed = self.decomposed + _postnet_patterns[c]
- return self.decomposed
-
- def computeSize(self):
- self.width = len(self.decomposed) * self.barwide
- self.width = self.width + (len(self.decomposed) - 1) * self.spacewide
- self.height = self.fbarheight
- self.xo = 0.0
-
- def draw(self):
- sdown = self.fbarheight - self.sbarheight
- left = self.xo
-
- for c in self.decomposed:
- if c == '.':
- h = self.sbarheight
- else:
- h = self.fbarheight
- self.rect(left, 0.0, self.barwide, h)
- left = left + self.barwide + self.spacewide
+# -*- coding: utf-8 -*- +# +# Copyright (c) 1996-2000 Tyler C. Sarna <tsarna@sarna.org> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by Tyler C. Sarna. +# 4. Neither the name of the author nor the names of contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +from reportlab.lib.units import inch +from common import Barcode +import string + +_fim_patterns = { + 'A' : "|| | ||", + 'B' : "| || || |", + 'C' : "|| | | ||", + 'D' : "||| | |||", + # XXX There is an E. + # The below has been seen, but dunno if it is E or not: + # 'E' : '|||| ||||' +} + +_postnet_patterns = { + '1' : "...||", '2' : "..|.|", '3' : "..||.", '4' : ".|..|", + '5' : ".|.|.", '6' : ".||..", '7' : "|...|", '8' : "|..|.", + '9' : "|.|..", '0' : "||...", 'S' : "|", +} + + +class FIM(Barcode): + """" + FIM (Facing ID Marks) encode only one letter. + There are currently four defined: + + A Courtesy reply mail with pre-printed POSTNET + B Business reply mail without pre-printed POSTNET + C Business reply mail with pre-printed POSTNET + D OCR Readable mail without pre-printed POSTNET + + Interleaved 2 of 5 is a numeric-only barcode. It encodes an even + number of digits; if an odd number is given, a 0 is prepended. + + Options that may be passed to constructor: + + value (single character string from the set A - D. required.): + The value to encode. + + quiet (bool, default 1): + Wether to include quiet zones in the symbol. + + The following may also be passed, but doing so will generate nonstandard + symbols which should not be used. This is mainly documented here to + show the defaults: + + height (float, default 5/8 inch): + Height of the code. This might legitimately be overriden to make + a taller symbol that will 'bleed' off the edge of the paper, + leaving 5/8 inch remaining. + + lquiet (float, default 1/4 inch): + Quiet zone size to left of code, if quiet is true. + Default is the greater of .25 inch, or .15 times the symbol's + length. + + rquiet (float, default 15/32 inch): + Quiet zone size to right left of code, if quiet is true. + + Sources of information on FIM: + + USPS Publication 25, A Guide to Business Mail Preparation + http://new.usps.com/cpim/ftp/pubs/pub25.pdf + """ + + def __init__(self, value='', **args): + self.barwidth = inch * (1.0/32.0) + self.barspace = inch * (1.0/16.0) + self.height = inch * (5.0/8.0) + self.rquiet = inch * (0.25) + self.lquiet = inch * (15.0/32.0) + self.quiet = 0 + + for (k, v) in args.items(): + setattr(self, k, v) + + Barcode.__init__(self, value) + + def validate(self): + self.valid = 1 + self.validated = '' + for c in self.value: + if c in string.whitespace: + continue + elif c in "abcdABCD": + self.validated = self.validated + string.upper(c) + else: + self.valid = 0 + + if len(self.validated) != 1: + raise ValueError, "Input must be exactly one character" + + return self.validated + + def decompose(self): + self.decomposed = '' + for c in self.encoded: + self.decomposed = self.decomposed + _fim_patterns[c] + + return self.decomposed + + def computeSize(self): + self.width = (len(self.decomposed) - 1) * self.barspace + self.barwidth + if self.quiet: + self.xo = self.lquiet + self.width = self.lquiet + self.width + self.rquiet + else: + self.xo = 0.0 + + def draw(self): + left = self.xo + for c in self.decomposed: + if c == '|': + self.rect(left, 0.0, self.barwidth, self.height) + left = left + self.barspace + + +class POSTNET(Barcode): + """" + POSTNET is used in the US to encode "zip codes" (postal codes) on + mail. It can encode 5, 9, or 11 digit codes. I've read that it's + pointless to do 5 digits, since USPS will just have to re-print + them with 9 or 11 digits. + + Sources of information on POSTNET: + + USPS Publication 25, A Guide to Business Mail Preparation + http://new.usps.com/cpim/ftp/pubs/pub25.pdf + """ + + def __init__(self, value='', **args): + self.sbarheight = inch * 0.050 + self.fbarheight = inch * 0.125 + self.barwide = inch * 0.018 + self.spacewide = inch * 0.0275 + + for (k, v) in args.items(): + setattr(self, k, v) + + Barcode.__init__(self, value) + + def validate(self): + self.validated = '' + self.valid = 1 + count = 0 + for c in self.value: + if c in (string.whitespace + '-'): + pass + elif c in string.digits: + count = count + 1 + if count == 6: + self.validated = self.validated + '-' + self.validated = self.validated + c + else: + self.valid = 0 + + if len(self.validated) not in [5, 10, 12]: + self.valid = 0 + + return self.validated + + def encode(self): + self.encoded = "S" + check = 0 + for c in self.validated: + if c in string.digits: + self.encoded = self.encoded + c + check = check + string.atoi(c) + elif c == '-': + pass + else: + raise ValueError, "Invalid character in input" + check = (10 - (check % 10)) % 10 + self.encoded = self.encoded + `check` + 'S' + return self.encoded + + def decompose(self): + self.decomposed = '' + for c in self.encoded: + self.decomposed = self.decomposed + _postnet_patterns[c] + return self.decomposed + + def computeSize(self): + self.width = len(self.decomposed) * self.barwide + self.width = self.width + (len(self.decomposed) - 1) * self.spacewide + self.height = self.fbarheight + self.xo = 0.0 + + def draw(self): + sdown = self.fbarheight - self.sbarheight + left = self.xo + + for c in self.decomposed: + if c == '.': + h = self.sbarheight + else: + h = self.fbarheight + self.rect(left, 0.0, self.barwide, h) + left = left + self.barwide + self.spacewide # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auction/wizard/wizard_auction_invoice_buyer.py b/addons/auction/wizard/wizard_auction_invoice_buyer.py index c2e21e9ca8a..1754c093db8 100644 --- a/addons/auction/wizard/wizard_auction_invoice_buyer.py +++ b/addons/auction/wizard/wizard_auction_invoice_buyer.py @@ -79,7 +79,7 @@ def _makeInvoices(self, cr, uid, data, context): # ids = order_obj.lots_invoice(cr, uid, data['ids'],context,invoice_number) cr.commit() return { - 'domain': "[('id','in', ["+','.join(map(str,ids))+"])]", + 'domain': "[('id','in', ["+','.join(map(str, ids))+"])]", 'name': 'Buyer invoices', 'view_type': 'form', 'view_mode': 'tree,form', diff --git a/addons/auction/wizard/wizard_auction_journal.py b/addons/auction/wizard/wizard_auction_journal.py index 7a2807b9c27..220c61d379f 100644 --- a/addons/auction/wizard/wizard_auction_journal.py +++ b/addons/auction/wizard/wizard_auction_journal.py @@ -72,7 +72,7 @@ def _makeInvoices(self, cr, uid, data, context): ids = order_obj.seller_trans_create(cr, uid, data['ids'],context) cr.commit() return { - 'domain': "[('id','in', ["+','.join(map(str,ids))+"])]", + 'domain': "[('id','in', ["+','.join(map(str, ids))+"])]", 'name': 'Seller invoices', 'view_type': 'form', 'view_mode': 'tree,form', diff --git a/addons/base_module_quality/__init__.py b/addons/base_module_quality/__init__.py index b3a3980f120..25e9b2ae4f3 100644 --- a/addons/base_module_quality/__init__.py +++ b/addons/base_module_quality/__init__.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution diff --git a/addons/base_module_quality/__terp__.py b/addons/base_module_quality/__terp__.py index 5c01ad860ad..b09df81254a 100644 --- a/addons/base_module_quality/__terp__.py +++ b/addons/base_module_quality/__terp__.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution diff --git a/addons/base_module_quality/base_module_quality.py b/addons/base_module_quality/base_module_quality.py index 36ab9915468..8c404c27cfc 100644 --- a/addons/base_module_quality/base_module_quality.py +++ b/addons/base_module_quality/base_module_quality.py @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution diff --git a/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py b/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py index bf022e52b5e..3ff81bee311 100644 --- a/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py +++ b/addons/base_report_designer/wizard/tiny_sxw2rml/tiny_sxw2rml.py @@ -1,4 +1,3 @@ -#!/usr/bin/python # -*- coding: utf-8 -*- ############################################################################## # @@ -21,7 +20,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # ############################################################################## - +#!/usr/bin/python """ Tiny SXW2RML - The Open ERP's report engine diff --git a/addons/crm/crm.py b/addons/crm/crm.py index e73aafbdbd6..4b6b831935d 100644 --- a/addons/crm/crm.py +++ b/addons/crm/crm.py @@ -81,7 +81,7 @@ class crm_case_section(osv.osv): def _check_recursion(self, cr, uid, ids): level = 100 while len(ids): - cr.execute('select distinct parent_id from crm_case_section where id in ('+','.join(map(str,ids))+')') + cr.execute('select distinct parent_id from crm_case_section where id in ('+','.join(map(str, ids))+')') ids = filter(None, map(lambda x:x[0], cr.fetchall())) if not level: return False diff --git a/addons/crm/report/report_businessopp.py b/addons/crm/report/report_businessopp.py index c618151da7c..fb54dc88b18 100644 --- a/addons/crm/report/report_businessopp.py +++ b/addons/crm/report/report_businessopp.py @@ -55,7 +55,7 @@ class report_custom(report_int): minbenef = 999999999999999999999 maxbenef = 0 - cr.execute('select probability, planned_revenue, planned_cost, user_id, res_users.name as name from crm_case left join res_users on (crm_case.user_id=res_users.id) where crm_case.id in ('+','.join(map(str,ids))+') order by user_id') + cr.execute('select probability, planned_revenue, planned_cost, user_id, res_users.name as name from crm_case left join res_users on (crm_case.user_id=res_users.id) where crm_case.id in ('+','.join(map(str, ids))+') order by user_id') res = cr.dictfetchall() for row in res: diff --git a/addons/document/document.py b/addons/document/document.py index 8c88be59858..10b49ecabe9 100644 --- a/addons/document/document.py +++ b/addons/document/document.py @@ -301,7 +301,7 @@ class document_directory(osv.osv): def _check_recursion(self, cr, uid, ids): level = 100 while len(ids): - cr.execute('select distinct parent_id from document_directory where id in ('+','.join(map(str,ids))+')') + cr.execute('select distinct parent_id from document_directory where id in ('+','.join(map(str, ids))+')') ids = filter(None, map(lambda x:x[0], cr.fetchall())) if not level: return False @@ -523,7 +523,7 @@ class document_file(osv.osv): def _data_get(self, cr, uid, ids, name, arg, context): result = {} - cr.execute('select id,store_fname,link from ir_attachment where id in ('+','.join(map(str,ids))+')') + cr.execute('select id,store_fname,link from ir_attachment where id in ('+','.join(map(str, ids))+')') for id,r,l in cr.fetchall(): try: value = file(os.path.join(self._get_filestore(cr), r), 'rb').read() diff --git a/addons/hr/hr.py b/addons/hr/hr.py index 88877383438..896a2047eda 100644 --- a/addons/hr/hr.py +++ b/addons/hr/hr.py @@ -101,7 +101,7 @@ class hr_employee_category(osv.osv): def _check_recursion(self, cr, uid, ids): level = 100 while len(ids): - cr.execute('select distinct parent_id from hr_employee_category where id in ('+','.join(map(str,ids))+')') + cr.execute('select distinct parent_id from hr_employee_category where id in ('+','.join(map(str, ids))+')') ids = filter(None, map(lambda x:x[0], cr.fetchall())) if not level: return False @@ -150,7 +150,7 @@ class hr_employee(osv.osv): def _check_recursion(self, cr, uid, ids): level = 100 while len(ids): - cr.execute('select distinct parent_id from hr_employee where id in ('+','.join(map(str,ids))+')') + cr.execute('select distinct parent_id from hr_employee where id in ('+','.join(map(str, ids))+')') ids = filter(None, map(lambda x:x[0], cr.fetchall())) if not level: return False diff --git a/addons/hr/hr_department.py b/addons/hr/hr_department.py index 9a795401d38..7c7c812d823 100644 --- a/addons/hr/hr_department.py +++ b/addons/hr/hr_department.py @@ -43,7 +43,7 @@ class hr_department(osv.osv): def _check_recursion(self, cr, uid, ids): level = 100 while len(ids): - cr.execute('select distinct parent_id from hr_department where id in ('+','.join(map(str,ids))+')') + cr.execute('select distinct parent_id from hr_department where id in ('+','.join(map(str, ids))+')') ids = filter(None, map(lambda x:x[0], cr.fetchall())) if not level: return False diff --git a/addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py b/addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py index 637d0383ef2..a1d7a4f3826 100644 --- a/addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py +++ b/addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py @@ -1,3 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). +# +# 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__ = "Change signs of old holiday requests" def migrate(cr, version): diff --git a/addons/hr_holidays/migrations/1.5/post-01-convert-limits-into-requests.py b/addons/hr_holidays/migrations/1.5/post-01-convert-limits-into-requests.py index ce067f8f98f..1d074a6f979 100644 --- a/addons/hr_holidays/migrations/1.5/post-01-convert-limits-into-requests.py +++ b/addons/hr_holidays/migrations/1.5/post-01-convert-limits-into-requests.py @@ -1,3 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). +# +# 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__ = "Convert the Holidays Per User limits into positive leave request" def migrate(cr, version): diff --git a/addons/hr_timesheet_sheet/wizard/wizard_timesheet_current.py b/addons/hr_timesheet_sheet/wizard/wizard_timesheet_current.py index 7dfe5f4e2b5..d5a7a00e082 100644 --- a/addons/hr_timesheet_sheet/wizard/wizard_timesheet_current.py +++ b/addons/hr_timesheet_sheet/wizard/wizard_timesheet_current.py @@ -38,7 +38,7 @@ class wiz_timesheet_open(wizard.interface): view_type = 'form,tree' if len(ids) > 1: view_type = 'tree,form' - domain = "[('id','in',["+','.join(map(str,ids))+"]),('user_id', '=', uid)]" + domain = "[('id','in',["+','.join(map(str, ids))+"]),('user_id', '=', uid)]" elif len(ids)==1: ts.write(cr, uid, ids, {'date_current': time.strftime('%Y-%m-%d')}) domain = "[('user_id', '=', uid)]" diff --git a/addons/l10n_ch/account_move_line.py b/addons/l10n_ch/account_move_line.py index e602d6bbdb8..dabd4345938 100755 --- a/addons/l10n_ch/account_move_line.py +++ b/addons/l10n_ch/account_move_line.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # # account_move_line.py # l10n_ch diff --git a/addons/l10n_ch/bank.py b/addons/l10n_ch/bank.py index 32310eb00ee..cd30dde6bb4 100755 --- a/addons/l10n_ch/bank.py +++ b/addons/l10n_ch/bank.py @@ -1,4 +1,4 @@ -# +# -*- coding: utf-8 -*- # bank.py # l10n_ch # diff --git a/addons/l10n_ch/report/tiny_sxw2rml.py b/addons/l10n_ch/report/tiny_sxw2rml.py index e7a5422b6ec..bb5e06e8ce7 100755 --- a/addons/l10n_ch/report/tiny_sxw2rml.py +++ b/addons/l10n_ch/report/tiny_sxw2rml.py @@ -1,6 +1,3 @@ - - -#!/usr/bin/python #coding: latin-1 ############################################################################## @@ -32,7 +29,7 @@ # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ############################################################################## - +#!/usr/bin/python """ Tiny SXW2RML - The Tiny ERP's report engine diff --git a/addons/l10n_ch_chart_c2c_pcg/__init__.py b/addons/l10n_ch_chart_c2c_pcg/__init__.py index 6c39925500a..6785a497df7 100644 --- a/addons/l10n_ch_chart_c2c_pcg/__init__.py +++ b/addons/l10n_ch_chart_c2c_pcg/__init__.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # # __init__.py # diff --git a/addons/l10n_ch_chart_c2c_pcg/wizard/__init__.py b/addons/l10n_ch_chart_c2c_pcg/wizard/__init__.py index 9110a52dd0c..249f473e6b7 100755 --- a/addons/l10n_ch_chart_c2c_pcg/wizard/__init__.py +++ b/addons/l10n_ch_chart_c2c_pcg/wizard/__init__.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # # config.py # diff --git a/addons/membership/membership.py b/addons/membership/membership.py index dea77259eee..bb0afe71845 100644 --- a/addons/membership/membership.py +++ b/addons/membership/membership.py @@ -401,7 +401,7 @@ class Partner(osv.osv): def _check_recursion(self, cr, uid, ids): level = 100 while len(ids): - cr.execute('select distinct associate_member from res_partner where id in ('+','.join(map(str,ids))+')') + cr.execute('select distinct associate_member from res_partner where id in ('+','.join(map(str, ids))+')') ids = filter(None, map(lambda x:x[0], cr.fetchall())) if not level: return False diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 9519a7c93ec..423121eb64f 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -217,7 +217,7 @@ class mrp_bom(osv.osv): def _check_recursion(self, cr, uid, ids): level = 500 while len(ids): - cr.execute('select distinct bom_id from mrp_bom where id in ('+','.join(map(str,ids))+')') + cr.execute('select distinct bom_id from mrp_bom where id in ('+','.join(map(str, ids))+')') ids = filter(None, map(lambda x:x[0], cr.fetchall())) if not level: return False diff --git a/addons/product/product.py b/addons/product/product.py index 7e83bfa02f4..509bd61c373 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -208,7 +208,7 @@ class product_category(osv.osv): def _check_recursion(self, cr, uid, ids): level = 100 while len(ids): - cr.execute('select distinct parent_id from product_category where id in ('+','.join(map(str,ids))+')') + cr.execute('select distinct parent_id from product_category where id in ('+','.join(map(str, ids))+')') ids = filter(None, map(lambda x:x[0], cr.fetchall())) if not level: return False diff --git a/addons/project/project.py b/addons/project/project.py index 384db8f8f55..b9488a86cb9 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -165,7 +165,7 @@ class project(osv.osv): default['name'] = proj.name+_(' (copy)') res = super(project, self).copy(cr, uid, id, default, context) ids = self.search(cr, uid, [('parent_id','child_of', [res])]) - cr.execute('update project_task set active=True where project_id in ('+','.join(map(str,ids))+')') + cr.execute('update project_task set active=True where project_id in ('+','.join(map(str, ids))+')') return res def duplicate_template(self, cr, uid, ids,context={}): diff --git a/addons/project_gtd/wizard/project_gtd_daily.py b/addons/project_gtd/wizard/project_gtd_daily.py index d1371a5d037..9c02b1fd4a0 100644 --- a/addons/project_gtd/wizard/project_gtd_daily.py +++ b/addons/project_gtd/wizard/project_gtd_daily.py @@ -36,7 +36,7 @@ class wiz_timebox_open(wizard.interface): raise wizard.except_wizard(_('Error !'), _('No timebox of the type "%s" defined !') % (tbtype,)) view_type = 'form,tree' if len(ids) >= 1: - domain = "[('id','in',["+','.join(map(str,ids))+"])]" + domain = "[('id','in',["+','.join(map(str, ids))+"])]" else: domain = "[('user_id', '=', uid)]" value = { diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 9ff4be36f0b..cc6ba2f690d 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -111,7 +111,7 @@ class purchase_order(osv.osv): LEFT JOIN stock_picking p on (p.id=m.picking_id) WHERE - p.purchase_id in ('''+','.join(map(str,ids))+''') + p.purchase_id in ('''+','.join(map(str, ids))+''') GROUP BY m.state, p.purchase_id''') for oid,nbr,state in cr.fetchall(): if state=='cancel': diff --git a/addons/sale/unit_test/test.py b/addons/sale/unit_test/test.py index 6567e0e9f6b..ccc747033e3 100644 --- a/addons/sale/unit_test/test.py +++ b/addons/sale/unit_test/test.py @@ -1,3 +1,24 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved +# $Id$ +# +# 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 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +############################################################################## import unittest import pooler import netsvc diff --git a/addons/scrum/report/task_burndown.py b/addons/scrum/report/task_burndown.py index f4ecc7e1d1a..977d8fe9e6c 100644 --- a/addons/scrum/report/task_burndown.py +++ b/addons/scrum/report/task_burndown.py @@ -71,14 +71,14 @@ class report_tasks(report_int): io = StringIO.StringIO() if 'date_start' not in datas: - cr.execute('select min(date_start) from project_task where id in ('+','.join(map(str,ids))+')') + cr.execute('select min(date_start) from project_task where id in ('+','.join(map(str, ids))+')') dt = cr.fetchone()[0] if dt: datas['date_start'] = dt[:10] else: datas['date_start'] = time.strftime('%Y-%m-%d') if 'date_stop' not in datas: - cr.execute('select max(date_start),max(date_close) from project_task where id in ('+','.join(map(str,ids))+')') + cr.execute('select max(date_start),max(date_close) from project_task where id in ('+','.join(map(str, ids))+')') res = cr.fetchone() datas['date_stop'] = (res[0] and res[0][:10]) or time.strftime('%Y-%m-%d') if res[1] and datas['date_stop']<res[1]: diff --git a/addons/stock/wizard/stock_traceability.py b/addons/stock/wizard/stock_traceability.py index 2b8920c9a4d..c44ef548d5b 100644 --- a/addons/stock/wizard/stock_traceability.py +++ b/addons/stock/wizard/stock_traceability.py @@ -33,7 +33,7 @@ def action_traceability(type='move_history_ids', field='tracking_id'): cr.execute('select id from ir_ui_view where model=%s and field_parent=%s and type=%s', ('stock.move', type, 'tree')) view_id = cr.fetchone()[0] value = { - 'domain': "[('id','in',["+','.join(map(str,ids))+"])]", + 'domain': "[('id','in',["+','.join(map(str, ids))+"])]", 'name': ((type=='move_history_ids') and 'Upstream Traceability') or 'Downstream Traceability', 'view_type': 'tree', 'res_model': 'stock.move', |
