onix import/export
[wolnelektury.git] / src / isbn / models.py
1 # -*- coding: utf-8 -*-
2 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
3 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
4 #
5 from django.db import models
6 from jsonfield import JSONField
7
8
9 class ISBNPool(models.Model):
10     prefix = models.CharField(max_length=10)
11     suffix_from = models.IntegerField()
12     suffix_to = models.IntegerField()
13     ref_from = models.IntegerField()
14     next_suffix = models.IntegerField()
15
16     @staticmethod
17     def check_digit(prefix12):
18         digits = [int(d) for d in prefix12]
19         return str((-sum(digits[0::2]) + 7 * sum(digits[1::2])) % 10)
20
21     def isbn(self, suffix):
22         prefix_length = len(self.prefix)
23         suffix_length = 12 - prefix_length
24         suffix_str = ('%%0%dd' % suffix_length) % suffix
25         prefix12 = self.prefix + suffix_str
26         return prefix12 + self.check_digit(prefix12)
27
28
29 class ONIXRecord(models.Model):
30     isbn_pool = models.ForeignKey(ISBNPool)
31     datestamp = models.DateField(auto_now=True)
32     suffix = models.IntegerField()
33     product_form = models.CharField(max_length=4)
34     product_form_detail = models.CharField(max_length=8, blank=True)
35     title = models.CharField(max_length=256)
36     part_number = models.CharField(max_length=64, blank=True)
37     contributors = JSONField()  # roles, names, optional: ISNI, date of birth/death
38     edition_type = models.CharField(max_length=4)
39     edition_number = models.IntegerField(default=1)
40     language = models.CharField(max_length=4)
41     imprint = models.CharField(max_length=256)
42     publishing_date = models.DateField()
43
44     class Meta:
45         ordering = ['isbn_pool__id', 'suffix']
46
47     def isbn(self):
48         return self.isbn_pool.isbn(self.suffix)
49
50     def reference(self):
51         return 'pl-eisbn-%s' % (self.isbn_pool.ref_from + self.suffix)