Better management of manually-set members.
[wolnelektury.git] / src / isbn / management / commands / import_onix.py
index 1d86e96..1a1fe9e 100644 (file)
@@ -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 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',
 
 DIRECT_FIELDS = {
     'product_form': 'ProductForm',
@@ -18,7 +22,7 @@ DIRECT_FIELDS = {
     'imprint': 'ImprintName',
 }
 
     'imprint': 'ImprintName',
 }
 
-UNNAMED = u'Autor nieznany'
+UNKNOWN = 'Autor nieznany'
 
 
 def parse_date(date_str):
 
 
 def parse_date(date_str):
@@ -29,9 +33,9 @@ def parse_date(date_str):
 
 
 def get_descendants(element, tags):
 
 
 def get_descendants(element, tags):
-    if isinstance(tags, basestring):
+    if isinstance(tags, str):
         tags = [tags]
         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):
 
 
 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."
 
 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
         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')]
             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,
             }
                     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']))
                 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'),
         }
         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 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'):
             del contributor_data['name']
             contributor_data['unnamed'] = '01'
         for date_elem in get_descendants(contributor, 'ContributorDate'):