X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/145e56d0df5162f8b57574e5b5656c6354274280..2881133ed8ebf9317ca216e384e7e13b8619b6a5:/apps/api/management/commands/mobileinit.py?ds=sidebyside diff --git a/apps/api/management/commands/mobileinit.py b/apps/api/management/commands/mobileinit.py index 8e225f95a..57b41aa46 100755 --- a/apps/api/management/commands/mobileinit.py +++ b/apps/api/management/commands/mobileinit.py @@ -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})