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):
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()
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')
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')
schema = """
CREATE TABLE book (
id INTEGER PRIMARY KEY,
- title VARCHAR,
+ title VARCHAR,
+ cover VARCHAR,
html_file VARCHAR,
html_file_size INTEGER,
parent INTEGER,
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);
"""
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 = """
(:id, :category, :name, :sort_key, :book_ids);
"""
categories = {'author': 'autor',
- 'epoch': 'epoka',
- 'genre': 'gatunek',
- 'kind': 'rodzaj',
+ 'epoch': 'epoka',
+ 'genre': 'gatunek',
+ 'kind': 'rodzaj',
'theme': 'motyw'
}
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())
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})