136 lines
3.7 KiB
Python
136 lines
3.7 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
from __future__ import unicode_literals
|
||
|
|
||
|
from barcode.ean import EuropeanArticleNumber13
|
||
|
from barcode.errors import *
|
||
|
|
||
|
"""Module: barcode.isxn
|
||
|
|
||
|
:Provided barcodes: ISBN-13, ISBN-10, ISSN
|
||
|
|
||
|
This module provides some special codes, which are no standalone barcodes.
|
||
|
All codes where transformed to EAN-13 barcodes. In every case, the checksum
|
||
|
is new calculated.
|
||
|
|
||
|
Example::
|
||
|
|
||
|
>>> from barcode import get_barcode
|
||
|
>>> ISBN = get_barcode('isbn10')
|
||
|
>>> isbn = ISBN('0132354187')
|
||
|
>>> unicode(isbn)
|
||
|
'0132354187'
|
||
|
>>> isbn.get_fullcode()
|
||
|
'9780132354189'
|
||
|
>>> # Test with wrong checksum
|
||
|
>>> isbn = ISBN('0132354180')
|
||
|
>>> unicode(isbn)
|
||
|
'0132354187'
|
||
|
|
||
|
"""
|
||
|
__docformat__ = 'restructuredtext en'
|
||
|
|
||
|
|
||
|
class InternationalStandardBookNumber13(EuropeanArticleNumber13):
|
||
|
"""Initializes new ISBN-13 barcode.
|
||
|
|
||
|
:parameters:
|
||
|
isbn : String
|
||
|
The isbn number as string.
|
||
|
writer : barcode.writer Instance
|
||
|
The writer to render the barcode (default: SVGWriter).
|
||
|
"""
|
||
|
|
||
|
name = 'ISBN-13'
|
||
|
|
||
|
def __init__(self, isbn, writer=None):
|
||
|
isbn = isbn.replace('-', '')
|
||
|
self.isbn13 = isbn
|
||
|
if isbn[:3] not in ('978', '979'):
|
||
|
raise WrongCountryCodeError('ISBN must start with 978 or 979.')
|
||
|
if isbn[:3] == '979':
|
||
|
if isbn[3:5] not in ('10', '11'):
|
||
|
raise BarcodeError('ISBN must start with 97910 or 97911.')
|
||
|
EuropeanArticleNumber13.__init__(self, isbn, writer)
|
||
|
|
||
|
|
||
|
class InternationalStandardBookNumber10(InternationalStandardBookNumber13):
|
||
|
"""Initializes new ISBN-10 barcode. This code is rendered as EAN-13 by
|
||
|
prefixing it with 978.
|
||
|
|
||
|
:parameters:
|
||
|
isbn : String
|
||
|
The isbn number as string.
|
||
|
writer : barcode.writer Instance
|
||
|
The writer to render the barcode (default: SVGWriter).
|
||
|
"""
|
||
|
|
||
|
name = 'ISBN-10'
|
||
|
|
||
|
digits = 9
|
||
|
|
||
|
def __init__(self, isbn, writer=None):
|
||
|
isbn = isbn.replace('-', '')
|
||
|
isbn = isbn[:self.digits]
|
||
|
self.isbn10 = isbn
|
||
|
self.isbn10 = '{0}{1}'.format(isbn, self._calculate_checksum())
|
||
|
InternationalStandardBookNumber13.__init__(self, '978' + isbn, writer)
|
||
|
|
||
|
def _calculate_checksum(self):
|
||
|
tmp = sum([x * int(y) for x, y in enumerate(self.isbn10[:9],
|
||
|
start=1)]) % 11
|
||
|
if tmp == 10:
|
||
|
return 'X'
|
||
|
else:
|
||
|
return tmp
|
||
|
|
||
|
def __unicode__(self):
|
||
|
return self.isbn10
|
||
|
|
||
|
__str__ = __unicode__
|
||
|
|
||
|
|
||
|
class InternationalStandardSerialNumber(EuropeanArticleNumber13):
|
||
|
"""Initializes new ISSN barcode. This code is rendered as EAN-13
|
||
|
by prefixing it with 977 and adding 00 between code and checksum.
|
||
|
|
||
|
:parameters:
|
||
|
issn : String
|
||
|
The issn number as string.
|
||
|
writer : barcode.writer Instance
|
||
|
The writer to render the barcode (default: SVGWriter).
|
||
|
"""
|
||
|
|
||
|
name = 'ISSN'
|
||
|
|
||
|
digits = 7
|
||
|
|
||
|
def __init__(self, issn, writer=None):
|
||
|
issn = issn.replace('-', '')
|
||
|
issn = issn[:self.digits]
|
||
|
self.issn = issn
|
||
|
self.issn = '{0}{1}'.format(issn, self._calculate_checksum())
|
||
|
EuropeanArticleNumber13.__init__(self, self.make_ean(), writer)
|
||
|
|
||
|
def _calculate_checksum(self):
|
||
|
tmp = 11 - sum([x * int(y) for x, y in
|
||
|
enumerate(reversed(self.issn[:7]), start=2)]) % 11
|
||
|
if tmp == 10:
|
||
|
return 'X'
|
||
|
else:
|
||
|
return tmp
|
||
|
|
||
|
def make_ean(self):
|
||
|
return '977{0}00{1}'.format(self.issn[:7], self._calculate_checksum())
|
||
|
|
||
|
def __unicode__(self):
|
||
|
return self.issn
|
||
|
|
||
|
__str__ = __unicode__
|
||
|
|
||
|
|
||
|
# Shortcuts
|
||
|
ISBN13 = InternationalStandardBookNumber13
|
||
|
ISBN10 = InternationalStandardBookNumber10
|
||
|
ISSN = InternationalStandardSerialNumber
|