Remove unused code.
authorRadek Czajka <rczajka@rczajka.pl>
Wed, 19 Dec 2018 20:34:40 +0000 (21:34 +0100)
committerRadek Czajka <rczajka@rczajka.pl>
Wed, 19 Dec 2018 20:42:27 +0000 (21:42 +0100)
src/api/emitters.py
src/api/helpers.py
src/api/management/__init__.py [deleted file]
src/api/management/commands/__init__.py [deleted file]
src/api/management/commands/mobileinit.py [deleted file]
src/api/urls.py
src/catalogue/models/book.py

index 531ae19..50a2d41 100644 (file)
@@ -4,71 +4,8 @@
 #
 """
 Wrappers for piston Emitter classes.
-
-When outputting a queryset of selected models, instead of returning
-XML or JSON stanzas, SSI include statements are returned.
-
 """
-from django.conf import settings
-from django.core.urlresolvers import reverse
-from django.db.models.query import QuerySet
-from piston.emitters import Emitter, XMLEmitter, JSONEmitter
-from catalogue.models import Book, Fragment, Tag
-from django.utils.translation import get_language
-
-
-class SsiQS(object):
-    """A wrapper for QuerySet that won't serialize."""
-
-    def __init__(self, queryset):
-        self.queryset = queryset
-
-    def __unicode__(self):
-        raise TypeError("This is not serializable.")
-
-    def get_ssis(self, emitter_format):
-        """Yields SSI include statements for the queryset."""
-        url_pattern = reverse(
-            'api_include',
-            kwargs={
-                'model': self.queryset.model.__name__.lower(),
-                'pk': '0000',
-                'emitter_format': emitter_format,
-                'lang': get_language(),
-            })
-        for instance in self.queryset:
-            yield "<!--#include file='%s'-->" % url_pattern.replace('0000', str(instance.pk))
-
-
-class SsiEmitterMixin(object):
-    def construct(self):
-        ssify_api = getattr(settings, 'SSIFY_API', True)
-        if ssify_api and isinstance(self.data, QuerySet) and self.data.model in (Book, Fragment, Tag):
-            return SsiQS(self.data)
-        else:
-            return super(SsiEmitterMixin, self).construct()
-
-
-class SsiJsonEmitter(SsiEmitterMixin, JSONEmitter):
-    def render(self, request):
-        try:
-            return super(SsiJsonEmitter, self).render(request)
-        except TypeError:
-            return '[%s]' % ",".join(self.construct().get_ssis('json'))
-
-Emitter.register('json', SsiJsonEmitter, 'application/json; charset=utf-8')
-
-
-class SsiXmlEmitter(SsiEmitterMixin, XMLEmitter):
-    def render(self, request):
-        try:
-            return super(SsiXmlEmitter, self).render(request)
-        except TypeError:
-            return '<?xml version="1.0" encoding="utf-8"?>\n' \
-                '<response><resource>%s</resource></response>' % \
-                '</resource><resource>'.join(self.construct().get_ssis('xml'))
-
-Emitter.register('xml', SsiXmlEmitter, 'text/xml; charset=utf-8')
+from piston.emitters import Emitter
 
 
 # hack
index 03fc18c..ffe9284 100644 (file)
@@ -2,15 +2,9 @@
 # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
-from time import mktime
 from piston.resource import Resource
 
 
-def timestamp(dtime):
-    """converts a datetime.datetime object to a timestamp int"""
-    return int(mktime(dtime.timetuple()))
-
-
 class CsrfExemptResource(Resource):
     """A Custom Resource that is csrf exempt"""
     def __init__(self, handler, authentication=None):
diff --git a/src/api/management/__init__.py b/src/api/management/__init__.py
deleted file mode 100755 (executable)
index e69de29..0000000
diff --git a/src/api/management/commands/__init__.py b/src/api/management/commands/__init__.py
deleted file mode 100755 (executable)
index e69de29..0000000
diff --git a/src/api/management/commands/mobileinit.py b/src/api/management/commands/mobileinit.py
deleted file mode 100755 (executable)
index ccf27bc..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-# -*- 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 datetime
-import os.path
-import sqlite3
-from django.core.management.base import BaseCommand
-
-from api.helpers import timestamp
-from api.settings import MOBILE_INIT_DB
-from catalogue.models import Book, Tag
-from wolnelektury.utils import makedirs
-
-
-class Command(BaseCommand):
-    help = 'Creates an initial SQLite file for the mobile app.'
-
-    def handle(self, **options):
-        # those should be versioned
-        last_checked = timestamp(datetime.now())
-        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')).exclude(items=None):
-            # only add non-empty tags
-            add_tag(db, t)
-        db.commit()
-        db.close()
-        current(last_checked)
-
-
-def pretty_size(size):
-    """ Turns size in bytes into a prettier string.
-
-        >>> pretty_size(100000)
-        '97 KiB'
-    """
-    if not size:
-        return None
-    units = ['B', 'KiB', 'MiB', 'GiB']
-    size = float(size)
-    unit = units.pop(0)
-    while size > 1000 and units:
-        size /= 1024
-        unit = units.pop(0)
-    if size < 10:
-        return "%.1f %s" % (size, unit)
-    return "%d %s" % (size, unit)
-    #
-    # if not isinstance(value, unicode):
-    #     value = unicode(value, 'utf-8')
-    #
-    # # try to replace chars
-    # 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')
-
-
-def init_db(last_checked):
-    makedirs(MOBILE_INIT_DB)
-    db = sqlite3.connect(os.path.join(MOBILE_INIT_DB, 'initial.db-%d' % last_checked))
-
-    schema = """
-CREATE TABLE book (
-    id INTEGER PRIMARY KEY, 
-    title VARCHAR,
-    cover VARCHAR,
-    html_file VARCHAR, 
-    html_file_size INTEGER, 
-    parent INTEGER,
-    parent_number INTEGER,
-
-    sort_key VARCHAR,
-    pretty_size VARCHAR,
-    authors VARCHAR,
-    _local BOOLEAN
-);
-CREATE INDEX IF NOT EXISTS book_title_index ON book (sort_key);
-CREATE INDEX IF NOT EXISTS book_title_index ON book (title);
-CREATE INDEX IF NOT EXISTS book_parent_index ON book (parent);
-
-CREATE TABLE tag (
-    id INTEGER PRIMARY KEY, 
-    name VARCHAR, 
-    category VARCHAR, 
-    sort_key VARCHAR, 
-    books VARCHAR);
-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 state (last_checked INTEGER);
-"""
-
-    db.executescript(schema)
-    db.execute("INSERT INTO state VALUES (:last_checked)", {'last_checked': last_checked})
-    return db
-
-
-def current(last_checked):
-    target = os.path.join(MOBILE_INIT_DB, 'initial.db')
-    if os.path.lexists(target):
-        os.unlink(target)
-    os.symlink(
-        'initial.db-%d' % last_checked,
-        target,
-    )
-
-
-book_sql = """
-    INSERT INTO book 
-        (id, title, cover, html_file,  html_file_size, parent, parent_number, sort_key, pretty_size, authors) 
-    VALUES 
-        (: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 = """
-    INSERT INTO tag
-        (id, category, name, sort_key, books)
-    VALUES
-        (:id, :category, :name, :sort_key, :book_ids);
-"""
-categories = {'author': 'autor',
-              'epoch': 'epoka',
-              'genre': 'gatunek',
-              'kind': 'rodzaj',
-              'theme': 'motyw'
-              }
-
-
-def add_book(db, book):
-    if book.html_file:
-        html_file = book.html_file.url
-        html_file_size = book.html_file.size
-    else:
-        html_file = html_file_size = None
-    db.execute(book_sql, {
-        'title': book.title,
-        'cover': book.cover.url if book.cover else None,
-        'html_file': html_file,
-        'html_file_size': html_file_size,
-        'parent': book.parent_id,
-        'parent_number': book.parent_number,
-        'sort_key': book.sort_key,
-        'size_str': pretty_size(html_file_size),
-        'authors': book.author_unicode(),
-    })
-
-
-def add_tag(db, tag):
-    books = Book.tagged_top_level([tag])
-    book_ids = ','.join(str(book_id) for book_id in books.values_list('id', flat=True))
-    db.execute(tag_sql, {
-        'category': categories[tag.category],
-        'name': tag.name,
-        'sort_key': tag.sort_key,
-        'book_ids': book_ids,
-    })
index bb0c1f4..bd832fe 100644 (file)
@@ -7,7 +7,6 @@ from django.views.decorators.csrf import csrf_exempt
 from django.views.generic import TemplateView
 from piston.authentication import OAuthAuthentication, oauth_access_token, oauth_request_token
 from piston.resource import Resource
-from ssify import ssi_included
 import catalogue.views
 from api import handlers
 from api.helpers import CsrfExemptResource
@@ -72,29 +71,12 @@ tags_re = r'^(?P<tags>(?:(?:[a-z0-9-]+/){2}){0,6})'
 paginate_re = r'(?:after/(?P<after>[a-z0-9-]+)/)?(?:count/(?P<count>[0-9]+)/)?$'
 
 
-@ssi_included
-def incl(request, model, pk, emitter_format):
-    resource = {
-        'book': book_list_resource,
-        'fragment': fragment_list_resource,
-        'tag': tag_list_resource,
-        }[model]
-    request.piwik_track = False
-    resp = resource(request, pk=pk, emitter_format=emitter_format)
-    if emitter_format == 'xml':
-        # Ugly, but quick way of stripping <?xml?> header and <response> tags.
-        resp.content = resp.content[49:-11]
-    return resp
-
-
 urlpatterns = [
     url(r'^oauth/request_token/$', oauth_request_token),
     url(r'^oauth/authorize/$', oauth_user_auth, name='oauth_user_auth'),
     url(r'^oauth/access_token/$', csrf_exempt(oauth_access_token)),
 
     url(r'^$', TemplateView.as_view(template_name='api/main.html'), name='api'),
-    url(r'^include/(?P<model>book|fragment|tag)/(?P<pk>\d+)\.(?P<lang>.+)\.(?P<emitter_format>xml|json)$',
-        incl, name='api_include'),
 
     # info boxes (used by mobile app)
     url(r'book/(?P<book_id>\d*?)/info\.html$', catalogue.views.book_info),
index dbbee78..8c53d9c 100644 (file)
@@ -115,8 +115,6 @@ class Book(models.Model):
     html_built = django.dispatch.Signal()
     published = django.dispatch.Signal()
 
-    short_html_url_name = 'catalogue_book_short'
-
     class AlreadyExists(Exception):
         pass