]> git.phdru.name Git - m_librarian.git/blobdiff - m_librarian/inp.py
Import INP(X)
[m_librarian.git] / m_librarian / inp.py
diff --git a/m_librarian/inp.py b/m_librarian/inp.py
new file mode 100644 (file)
index 0000000..db0a3d8
--- /dev/null
@@ -0,0 +1,70 @@
+
+__all__ = ['import_inpx']
+
+import os
+from zipfile import ZipFile
+from sqlobject import sqlhub, SQLObjectNotFound
+from .db import Author, Book, Extension, Genre, Language, insert_name
+
+
+EOT = chr(4)  # INP field separator
+
+
+def split_line(line):
+    parts = line.strip().split(EOT)
+    l = len(parts)
+    if l < 11:
+        raise ValueError('Unknown INP structure: "%s"' % line)
+    if l == 11:  # Standard structure
+        parts.append(None)  # Emulate lang
+    else:  # New structure
+        parts = parts[:12]
+    return parts
+
+
+def import_inp_line(archive, parts):
+    authors, genres, title, series, ser_no, file, size, lib_id, deleted, \
+        extension, date, language = parts
+    try:
+        Book.archive_file_idx.get(archive, file)
+    except SQLObjectNotFound:
+        pass
+    else:
+        return
+    try:
+        ser_no = int(ser_no)
+    except ValueError:
+        ser_no = None
+    size = int(size)
+    deleted = deleted == '1'
+    extension_row = insert_name(Extension, extension)
+    language_row = insert_name(Language, language)
+    book = Book(title=title, series=series, ser_no=ser_no,
+                archive=archive, file=file, size=size,
+                lib_id=lib_id, deleted=deleted,
+                extension=extension_row, date=date,
+                language=language_row)
+    for author in authors.split(':'):
+        if author:
+            author_row = insert_name(Author, author)
+            book.addAuthor(author_row)
+    for genre in genres.split(':'):
+        if genre:
+            genre_row = insert_name(Genre, genre, title=genre)
+            book.addGenre(genre_row)
+
+
+def import_inp(archive, inp):
+    for line in inp:
+        import_inp_line(archive, split_line(line))
+
+
+def import_inpx(path):
+    inpx = ZipFile(path)
+    for name in inpx.namelist():
+        archive, ext = os.path.splitext(name)
+        if ext != 'inp':
+            continue
+        inp = inpx.open(name)
+        sqlhub.doInTransaction(import_inp, archive + '.zip', inp)
+        inp.close()