X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/3af75386ed5c78b09c4669442a2422a388e949c3..6592ad610dc42a6242b5d5446addfb7a1feb01e0:/src/isbn/management/commands/import_onix.py?ds=sidebyside diff --git a/src/isbn/management/commands/import_onix.py b/src/isbn/management/commands/import_onix.py index 1d86e966a..1a1fe9e34 100644 --- a/src/isbn/management/commands/import_onix.py +++ b/src/isbn/management/commands/import_onix.py @@ -1,11 +1,15 @@ -# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# from datetime import date from lxml import etree from django.core.management.base import BaseCommand from isbn.models import ISBNPool, ONIXRecord +from librarian import XMLNamespace -ONIXNS = '{http://ns.editeur.org/onix/3.0/reference}' + +ONIXNS = XMLNamespace('http://ns.editeur.org/onix/3.0/reference') DIRECT_FIELDS = { 'product_form': 'ProductForm', @@ -18,7 +22,7 @@ DIRECT_FIELDS = { 'imprint': 'ImprintName', } -UNNAMED = u'Autor nieznany' +UNKNOWN = 'Autor nieznany' def parse_date(date_str): @@ -29,9 +33,9 @@ def parse_date(date_str): def get_descendants(element, tags): - if isinstance(tags, basestring): + if isinstance(tags, str): tags = [tags] - return element.findall('.//' + '/'.join(ONIXNS + tag for tag in tags)) + return element.findall('.//' + '/'.join(ONIXNS(tag) for tag in tags)) def get_field(element, tags, allow_multiple=False): @@ -43,14 +47,17 @@ def get_field(element, tags, allow_multiple=False): class Command(BaseCommand): help = "Import data from ONIX." - args = 'filename' - def handle(self, filename, *args, **options): + def add_arguments(self, parser): + parser.add_argument('filename') + + def handle(self, **options): + filename = options['filename'] tree = etree.parse(open(filename)) for product in get_descendants(tree, 'Product'): isbn = get_field(product, ['ProductIdentifier', 'IDValue']) assert len(isbn) == 13 - pool = ISBNPool.objects.get(prefix__in=[isbn[:i] for i in xrange(8, 11)]) + pool = ISBNPool.objects.get(prefix__in=[isbn[:i] for i in range(8, 11)]) contributors = [ self.parse_contributor(contributor) for contributor in get_descendants(product, 'Contributor')] @@ -61,7 +68,7 @@ class Command(BaseCommand): get_field(product, ['PublishingDate', 'Date'], allow_multiple=True)), 'contributors': contributors, } - for field, tag in DIRECT_FIELDS.iteritems(): + for field, tag in DIRECT_FIELDS.items(): record_data[field] = get_field(product, tag) or '' record = ONIXRecord.objects.create(**record_data) ONIXRecord.objects.filter(pk=record.pk).update(datestamp=parse_date(product.attrib['datestamp'])) @@ -77,10 +84,10 @@ class Command(BaseCommand): contributor_data = { 'role': get_field(contributor, 'ContributorRole'), } - for key, value in data.iteritems(): + for key, value in data.items(): if value: contributor_data[key] = value - if contributor_data.get('name') == UNNAMED: + if contributor_data.get('name') == UNKNOWN: del contributor_data['name'] contributor_data['unnamed'] = '01' for date_elem in get_descendants(contributor, 'ContributorDate'):