Preliminary math and tables support.
[wolnelektury.git] / apps / api / management / commands / mobileinit.py
index 8e225f9..57b41aa 100755 (executable)
@@ -8,12 +8,10 @@ import os.path
 import re
 import sqlite3
 from django.core.management.base import BaseCommand
-from slughifi import char_map
 
 from api.helpers import timestamp
 from api.settings import MOBILE_INIT_DB
 from catalogue.models import Book, Tag
-from catalogue.views import tagged_object_list # this should be somewhere else
 
 
 class Command(BaseCommand):
@@ -25,7 +23,9 @@ class Command(BaseCommand):
         db = init_db(last_checked)
         for b in Book.objects.all():
             add_book(db, b)
-        for t in Tag.objects.exclude(category__in=('book', 'set', 'theme')):
+        for t in Tag.objects.exclude(
+                category__in=('book', 'set', 'theme')).exclude(items=None):
+            # only add non-empty tags
             add_tag(db, t)
         db.commit()
         db.close()
@@ -51,26 +51,6 @@ def pretty_size(size):
     return "%d %s" % (size, unit)
 
 
-special_marks = {'ż': '|', 'Ż': '|',}
-def replace_char(m):
-    char = m.group()
-    if char_map.has_key(char):
-        special = special_marks.get(char, '{')
-        return char_map[char] + special
-    else:
-        return char
-
-def sortify(value):
-    """
-        Turns Unicode into ASCII-sortable str
-
-        Examples :
-
-        >>> slughifi('aa') < slughifi('a a') < slughifi('ą') < slughifi('b')
-        True
-
-    """
-
     if not isinstance(value, unicode):
         value = unicode(value, 'utf-8')
 
@@ -78,7 +58,7 @@ def sortify(value):
     value = re.sub('[^a-zA-Z0-9\\s\\-]{1}', replace_char, value)
     value = value.lower()
     value = re.sub(r'[^a-z0-9{|}]+', '~', value)
-    
+
     return value.encode('ascii', 'ignore')
 
 
@@ -91,7 +71,8 @@ def init_db(last_checked):
     schema = """
 CREATE TABLE book (
     id INTEGER PRIMARY KEY, 
-    title VARCHAR, 
+    title VARCHAR,
+    cover VARCHAR,
     html_file VARCHAR, 
     html_file_size INTEGER, 
     parent INTEGER,
@@ -116,10 +97,6 @@ CREATE INDEX IF NOT EXISTS tag_name_index ON tag (name);
 CREATE INDEX IF NOT EXISTS tag_category_index ON tag (category);
 CREATE INDEX IF NOT EXISTS tag_sort_key_index ON tag (sort_key);
 
-CREATE TABLE book_tag (book INTEGER, tag INTEGER);
-CREATE INDEX IF NOT EXISTS book_tag_book ON book_tag (book);
-CREATE INDEX IF NOT EXISTS book_tag_tag_index ON book_tag (tag);
-
 CREATE TABLE state (last_checked INTEGER);
 """
 
@@ -130,19 +107,20 @@ CREATE TABLE state (last_checked INTEGER);
 
 def current(last_checked):
     target = os.path.join(MOBILE_INIT_DB, 'initial.db')
-    os.unlink(target)
+    if os.path.lexists(target):
+        os.unlink(target)
     os.symlink(
         'initial.db-%d' % last_checked,
         target,
     )
-    
+
 
 
 book_sql = """
     INSERT INTO book 
-        (id, title, html_file,  html_file_size, parent, parent_number, sort_key, pretty_size, authors) 
+        (id, title, cover, html_file,  html_file_size, parent, parent_number, sort_key, pretty_size, authors) 
     VALUES 
-        (:id, :title, :html_file, :html_file_size, :parent, :parent_number, :sort_key, :size_str, :authors);
+        (:id, :title, :cover, :html_file, :html_file_size, :parent, :parent_number, :sort_key, :size_str, :authors);
 """
 book_tag_sql = "INSERT INTO book_tag (book, tag) VALUES (:book, :tag);"
 tag_sql = """
@@ -152,9 +130,9 @@ tag_sql = """
         (:id, :category, :name, :sort_key, :book_ids);
 """
 categories = {'author': 'autor',
-              'epoch': 'epoka', 
-              'genre': 'gatunek', 
-              'kind': 'rodzaj', 
+              'epoch': 'epoka',
+              'genre': 'gatunek',
+              'kind': 'rodzaj',
               'theme': 'motyw'
               }
 
@@ -167,9 +145,13 @@ def add_book(db, book):
         html_file_size = book.html_file.size
     else:
         html_file = html_file_size = None
-    parent = book.parent
+    if book.cover:
+        cover = book.cover.url
+    else:
+        cover = None
+    parent = book.parent_id
     parent_number = book.parent_number
-    sort_key = sortify(title)
+    sort_key = book.sort_key
     size_str = pretty_size(html_file_size)
     authors = ", ".join(t.name for t in book.tags.filter(category='author'))
     db.execute(book_sql, locals())
@@ -179,11 +161,8 @@ def add_tag(db, tag):
     id = tag.id
     category = categories[tag.category]
     name = tag.name
-    sort_key = sortify(tag.sort_key)
+    sort_key = tag.sort_key
 
-    books = list(tagged_object_list(None, [tag], api=True))
+    books = Book.tagged_top_level([tag])
     book_ids = ','.join(str(b.id) for b in books)
     db.execute(tag_sql, locals())
-
-    for b in books:
-        db.execute(book_tag_sql, {'book': b.id, 'tag': tag.id})