Commit 011b5b89 authored by Dmitry Shelepnev's avatar Dmitry Shelepnev
Browse files

Add comments to opds_catalog.settings

parent 7ab03c87
Loading
Loading
Loading
Loading
+31 −25
Original line number Diff line number Diff line
@@ -567,11 +567,14 @@ class SearchAuthorsFeed(AuthFeed):

        if searchtype == 'm':
            #concat(last_name,' ',first_name)
            authors = Author.objects.extra(where=["upper(concat(last_name,' ',first_name)) like %s"], params=["%%%s%%"%searchterms.upper()])
            #authors = Author.objects.extra(where=["upper(concat(last_name,' ',first_name)) like %s"], params=["%%%s%%"%searchterms.upper()])
            authors = Author.objects.filter(search_full_name__contains=searchterms.upper())
        elif searchtype == 'b':
            authors = Author.objects.extra(where=["upper(concat(last_name,' ',first_name)) like %s"], params=["%s%%"%searchterms.upper()])  
            #authors = Author.objects.extra(where=["upper(concat(last_name,' ',first_name)) like %s"], params=["%s%%"%searchterms.upper()]) 
            authors = Author.objects.filter(search_full_name__startswith=searchterms.upper()) 
        elif searchtype == 'e':
            authors = Author.objects.extra(where=["upper(concat(last_name,' ',first_name))=%s"], params=["%s"%searchterms.upper()])                       
            #authors = Author.objects.extra(where=["upper(concat(last_name,' ',first_name))=%s"], params=["%s"%searchterms.upper()])   
            authors = Author.objects.filter(search_full_name=searchterms.upper())                    
        return {"authors":authors, "searchterms":searchterms, "searchtype":searchtype, "page":page}

    def link(self, obj):
@@ -634,11 +637,14 @@ class SearchSeriesFeed(AuthFeed):
            page = int(page)

        if searchtype == 'm':
            series = Series.objects.extra(where=["upper(ser) like %s"], params=["%%%s%%"%searchterms.upper()])
            #series = Series.objects.extra(where=["upper(ser) like %s"], params=["%%%s%%"%searchterms.upper()])
            series = Series.objects.filter(search_ser__contains=searchterms.upper())
        elif searchtype == 'b':
            series = Series.objects.extra(where=["upper(ser) like %s"], params=["%s%%"%searchterms.upper()]) 
            #series = Series.objects.extra(where=["upper(ser) like %s"], params=["%s%%"%searchterms.upper()]) 
            series = Series.objects.filter(search_ser__startswith=searchterms.upper())
        elif searchtype == 'e':
            series = Series.objects.extra(where=["upper(ser)=%s"], params=["%s"%searchterms.upper()])             
            #series = Series.objects.extra(where=["upper(ser)=%s"], params=["%s"%searchterms.upper()])      
            series = Series.objects.filter(search_ser=searchterms.upper())       
        elif searchtype == 'a':
            try:
                self.author_id = int(searchterms)
@@ -672,7 +678,7 @@ class SearchSeriesFeed(AuthFeed):
        }

    def items(self, obj):
        series_list = obj["series"].order_by("ser")
        series_list = obj["series"].order_by("search_ser")

        paginator = Paginator(series_list,settings.MAXITEMS)
        try:
@@ -777,16 +783,16 @@ class BooksFeed(AuthFeed):
    def items(self, obj):
        length, chars = obj
        if self.lang_code:
            sql="""select %(length)s as l, upper(substring(title,1,%(length)s)) as id, count(*) as cnt 
            sql="""select %(length)s as l, substring(search_title,1,%(length)s) as id, count(*) as cnt 
                   from opds_catalog_book 
                   where lang_code=%(lang_code)s and upper(title) like '%(chars)s%%%%'
                   group by upper(substring(title,1,%(length)s)) 
                   where lang_code=%(lang_code)s and search_title like '%(chars)s%%%%'
                   group by substring(search_title,1,%(length)s)
                   order by id"""%{'length':length, 'lang_code':self.lang_code, 'chars':chars}
        else:
            sql="""select %(length)s as l, upper(substring(title,1,%(length)s)) as id, count(*) as cnt 
            sql="""select %(length)s as l, substring(search_title,1,%(length)s) as id, count(*) as cnt 
                   from opds_catalog_book 
                   where upper(title) like '%(chars)s%%%%'
                   group by upper(substring(title,1,%(length)s)) 
                   where search_title like '%(chars)s%%%%'
                   group by substring(search_title,1,%(length)s)
                   order by id"""%{'length':length,'chars':chars}
          
        dataset = Book.objects.raw(sql)
@@ -836,16 +842,16 @@ class AuthorsFeed(AuthFeed):
    def items(self, obj):
        length, chars = obj
        if self.lang_code:
            sql="""select %(length)s as l, upper(substring(concat(last_name,' ',first_name),1,%(length)s)) as id, count(*) as cnt 
            sql="""select %(length)s as l, substring(search_full_name,1,%(length)s) as id, count(*) as cnt 
                   from opds_catalog_author 
                   where lang_code=%(lang_code)s and upper(concat(last_name,' ',first_name)) like '%(chars)s%%%%'
                   group by upper(substring(concat(last_name,' ',first_name),1,%(length)s)) 
                   where lang_code=%(lang_code)s and search_full_name like '%(chars)s%%%%'
                   group by substring(search_full_name,1,%(length)s)
                   order by id"""%{'length':length, 'lang_code':self.lang_code, 'chars':chars}
        else:
            sql="""select %(length)s as l, upper(substring(concat(last_name,' ',first_name),1,%(length)s)) as id, count(*) as cnt 
            sql="""select %(length)s as l, substring(search_full_name,1,%(length)s) as id, count(*) as cnt 
                   from opds_catalog_author 
                   where upper(concat(last_name,' ',first_name)) like '%(chars)s%%%%'
                   group by upper(substring(concat(last_name,' ',first_name),1,%(length)s)) 
                   where search_full_name like '%(chars)s%%%%'
                   group by substring(search_full_name,1,%(length)s) 
                   order by id"""%{'length':length,'chars':chars}
          
        dataset = Author.objects.raw(sql)
@@ -895,16 +901,16 @@ class SeriesFeed(AuthFeed):
    def items(self, obj):
        length, chars = obj
        if self.lang_code:
            sql="""select %(length)s as l, upper(substring(ser,1,%(length)s)) as id, count(*) as cnt 
            sql="""select %(length)s as l, substring(search_ser,1,%(length)s) as id, count(*) as cnt 
                   from opds_catalog_series 
                   where lang_code=%(lang_code)s and upper(ser) like '%(chars)s%%%%'
                   group by upper(substring(ser,1,%(length)s)) 
                   where lang_code=%(lang_code)s and search_ser like '%(chars)s%%%%'
                   group by substring(search_ser,1,%(length)s) 
                   order by id"""%{'length':length, 'lang_code':self.lang_code, 'chars':chars}
        else:
            sql="""select %(length)s as l, upper(substring(ser,1,%(length)s)) as id, count(*) as cnt 
            sql="""select %(length)s as l, substring(search_ser,1,%(length)s) as id, count(*) as cnt 
                   from opds_catalog_series 
                   where upper(ser) like '%(chars)s%%%%'
                   group by upper(substring(ser,1,%(length)s)) 
                   where search_ser like '%(chars)s%%%%'
                   group by substring(search_ser,1,%(length)s) 
                   order by id"""%{'length':length,'chars':chars}
          
        dataset = Series.objects.raw(sql)
+0 −11
Original line number Diff line number Diff line
@@ -29,9 +29,6 @@ class Book(models.Model):
    title = models.CharField(max_length=256, db_index=True)
    search_title = models.CharField(max_length=256, default=None, db_index=True)
    annotation = models.CharField(max_length=10000)
    #cover = models.CharField(max_length=32)
    #cover_type = models.CharField(max_length=32)
    #doublicat = models.IntegerField(null=False, default=0)
    lang_code = models.IntegerField(db_index=True, null=False, default=9)
    avail = models.IntegerField(null=False, default=0, db_index=True)
    authors = models.ManyToManyField('Author', through='bauthor')
@@ -51,16 +48,10 @@ class Catalog(models.Model):
    cat_size = models.IntegerField(null=True, default=0)

class Author(models.Model):
    #first_name = models.CharField(max_length=64)
    #last_name = models.CharField(max_length=64)
    full_name = models.CharField(db_index=True, max_length=128, default=None)
    search_full_name = models.CharField(db_index=True, max_length=128, default=None)
    lang_code = models.IntegerField(db_index=True, null=False, default=9)

    #class Meta:
    #    index_together = [
    #        ["last_name", "first_name"],
    #    ]

class bauthor(models.Model):
    book = models.ForeignKey('Book', db_index=True)
@@ -78,7 +69,6 @@ class Genre(models.Model):
class bgenre(models.Model):
    book = models.ForeignKey('Book', db_index=True)
    genre = models.ForeignKey('Genre', db_index=True)

#    class Meta:
#        index_together = [
#            ["book", "genre"],
@@ -93,7 +83,6 @@ class bseries(models.Model):
    book = models.ForeignKey('Book', db_index=True)
    ser = models.ForeignKey('Series', db_index=True)
    ser_no = models.IntegerField(null=False, default=0)

#    class Meta:
#        index_together = [
#            ["book", "ser"],
+33 −14
Original line number Diff line number Diff line
@@ -79,40 +79,59 @@ def zipisscanned(zipname):
    return row_count


def arc_changed(arcpath,arcsize):
def arc_skip(arcpath,arcsize):
    """
       Выясняем изменялся ли архив (ZIP или INP-файл)
       если нет, то пытаемся пропустить сканирование, устанавливая для всех книг из
       архива avail=2
       Если не одной такой книги не нашлось, то считаем что пропуск сканирования не удался
       и возвращаем 0
       Если книги из искомого каталога имелись и для них установлен avail=2, то пропуск возможен 
       и возвращаем 1 (или row_count)      
    """
    catalog = findcat(arcpath)
    
    # Если такого каталога еще нет в БД, то значит считаем что ZIP изменен
    # Если такого каталога еще нет в БД, то значит считаем что ZIP изменен и пропуск невозможен
    if catalog == None:
        return 1
        return 0
    
    # Если каталог в БД найден и его размер совпадает с текущим, то считаем что файл архива не менялся
    # Поэтому делаем update всех книг из этого архива, однако если ни одного изменения не произошло, то
    # таких книг нет, поэтому видимо нужно пересканировать архив
    if arcsize == catalog.cat_size:
        row_count = Book.objects.filter(path=arcpath).update(avail=2)
        if row_count == 0:
            return 1 
        return 0
        return row_count 
    
    # Здесь мы оказываемся если размеры архива в БД и в наличии разные, поэтому считаем что изменения в архиве есть 
    return 1
    # и пропуск сканирования невозможен    
    return 0
    

def inpx_changed(arcpath,arcsize):
def inpx_skip(arcpath,arcsize):
    """
       Выясняем изменялся ли INPX
       Выясняем изменялся ли INPX-файл)
       если нет, то пытаемся пропустить сканирование, устанавливая для всех книг из
       INPX avail=2
       Если не одной такой книги не нашлось, то считаем что пропуск сканирования не удался
       и возвращаем 0
       Если книги из искомого INPX имелись и для них установлен avail=2, то пропуск возможен 
       и возвращаем 1 (или row_count)      
    """
    catalog = findcat(arcpath)

    # Если такого INPX еще нет в БД, то значит считаем что INPX изменен и пропуск невозможен
    if catalog == None:
        return 1
        return 0

    if arcsize != catalog.cat_size:
        return 1
    # Если INPX в БД найден и его размер совпадает с текущим, то считаем что файл INPX не менялся
    # Поэтому делаем update всех книг из этого INPX, однако если ни одного изменения не произошло, то
    # таких книг нет, поэтому видимо нужно пересканировать архив
    if arcsize == catalog.cat_size:
        row_count = Book.objects.filter(catalog__parent=catalog).update(avail=2)
        return row_count     
    
    # Здесь мы оказываемся если размеры INPX в БД и в наличии разные, поэтому считаем что изменения в архиве есть 
    # и пропуск сканирования невозможен        
    return 0

def findcat(cat_name):
+75 −12
Original line number Diff line number Diff line
@@ -4,43 +4,106 @@ from django.conf import settings

loglevels={'debug':logging.DEBUG,'info':logging.INFO,'warning':logging.WARNING,'error':logging.ERROR,'critical':logging.CRITICAL,'none':logging.NOTSET}

VERSION = "0.33b"
VERSION = "0.34b"

# Main SOPDS Book Collection Directory
# ROOT_LIB содержит путь к каталогу в котором расположена ваша коллекция книг
ROOT_LIB = getattr(settings, "SOPDS_ROOT_LIB", "books/")

# Списк форматов книг, которые будут включаться в каталог
BOOK_EXTENSIONS = getattr(settings, "SOPDS_BOOK_EXTESIONS", ['.pdf', '.djvu', '.fb2', '.epub'])

# Количество выдаваемых строк на одну страницу
MAXITEMS = getattr(settings, "SOPDS_MAXITEMS", 60)
# Скрывает, найденные дубликаты в выдачах книг
DOUBLES_HIDE = getattr(settings, "SOPDS_DOUBLES_HIDE", True)

# Извлекать метаинформацию из книг fb2
FB2PARSE = getattr(settings, "SOPDS_FB2PARSE", True)
FB2HSIZE = getattr(settings, "SOPDS_FB2HSIZE", 0)

# cover_show - способ показа обложек:
# False - не показывать, 
# True - извлекать обложки на лету и показывать 
COVER_SHOW = getattr(settings, "SOPDS_COVER_SHOW", True)

# ZIPSCAN = True  - Приводит к сканированию файлов архива
ZIPSCAN = getattr(settings, "SOPDS_ZIPSCAN", True)
ZIPRESCAN = getattr(settings, "SOPDS_ZIPRESCAN", False)

# Указываем какая кодировка для названий файлов используется в ZIP-архивах
# доступные кодировки: cp437, cp866, cp1251, utf-8
# по умолчанию применяется кодировка cp437
# Поскольку в самом ZIP архиве сведения о кодировке, в которой находятся имена файлов - отсутствуют
# то автоматически определить правильную кодировку для имен файлов не представляется возможным
# поэтому для того чтобы кириллические имена файлов не ваыглядели как крякозябры следует применять кодировку cp866
# по умолчанию также используется значение zip_codepage = cp866
ZIPCODEPAGE = getattr(settings, "SOPDS_ZIPCODEPAGE", "cp866")

# Если INPX_ENABLE = True, то при обнаружении INPX файла в каталоге, сканер не сканирует его содержимое вместе с подгаталогами, а загружает
# данные из найденного INPX файла. Сканер считает что сами архивыс книгами расположены в этом же каталоге. 
# Т.е. INPX-файл должен находится именно в папке с архивами книг
INPX_ENABLE = getattr(settings, "SOPDS_INPX_ENABLE", True)

# Если INPX_SKIP_UNCHANGED = True, то сканер пропускает повторное сканирование, если размер INPX не изменялся
INPX_SKIP_UNCHANGED = getattr(settings, "SOPDS_INPX_SKIP_UNCHANGED", True)

# Если INPX_TEST_ZIP = True, то сканер пытается найти описанный в INPX архив. Если какой-то архив не обнаруживается, 
# то сканер не будет добавлять вязанные с ним данные из INPX в базу данных
# соответсвенно, если INPX_TEST_ZIP = False, то никаких проверок сканер не производит, а просто добавляет данные из INPX в БД
# это гораздо быстрее
INPX_TEST_ZIP = getattr(settings, "SOPDS_INPX_TEST_ZIP", False)

# Если INPX_TEST_FILES = True, то сканер пытается найти описанный в INPX конкретный файл с книгой (уже внутри архивов). Если какой-то файл не обнаруживается, 
# то сканер не будет добавлять эту книгу в базу данных
# соответсвенно, если INPX_TEST_FILES = False, то никаких проверок сканер не производит, а просто добавляет книгу из INPX в БД
# это гораздо быстрее
INPX_TEST_FILES = getattr(settings, "SOPDS_TEST_FILES", False)

# Установка DELETE_LOGICAL=True приведет к тому, что при обнаружении сканером, что книга удалена, запись в БД об этой книге будет удалена логически (avail=0)
# Если DELETE_LOGICAL=False, то произойдет физическое удаление таких записей из базы данных
# пока работает только DELETE_LOGICAL = False
DELETE_LOGICAL = getattr(settings, "SOPDS_DELETE_LOGICAL", False)

SPLITITEMS = getattr(settings, "SOPDS_SPLITITEMS", 300)

# Количество выдаваемых результатов на одну страницу
MAXITEMS = getattr(settings, "SOPDS_MAXITEMS", 60)

# FB2TOEPUB и FB2TOMOBI задают пути к програмам - конвертерам из FB2 в EPUB и MOBI
FB2TOEPUB = getattr(settings, "SOPDS_FB2TOEPUB", "")
FB2TOMOBI = getattr(settings, "SOPDS_FB2TOMOBI", "")

# TEMP_DIR задает путь к временному каталогу, который используется для копирования оригинала и результата конвертации
TEMP_DIR = getattr(settings, "SOPDS_TEMP_DIR", os.path.join(settings.BASE_DIR,'tmp'))

# SINGLE_COMMIT = True приводит к тому, что сохранение данных сканирования произойден после окончания всего сканирования
# в результате во время сканирования нельзя увидеть уже добавленные книги, но эта опция значительно увеличивает скорость сканирования коллекции
SINGLE_COMMIT = getattr(settings, "SOPDS_SINGLE_COMMIT", True)

# При скачивании вместо оригинального имени файла книги выдает транслитерацию названия книги
TITLE_AS_FILENAME = getattr(settings, "SOPDS_TITLE_AS_FILENAME", True)

# Включение дополнительного меню выбора алфавита
ALPHABET_MENU = getattr(settings, "SOPDS_ALPHABET_MENU", True)

# Обложка, которая будет демонстрироваться для книг без обложек
NOCOVER_PATH = getattr(settings, "SOPDS_NOCOVER_PATH", os.path.join(settings.BASE_DIR,'static/images/nocover.jpg'))

# Включение BASIC - авторизации
AUTH = getattr(settings, "SOPDS_AUTH", False)

# параметры SERVER_LOG и SCANNER_LOG задают размещение LOG файлов этих процессов
SERVER_LOG = getattr(settings, "SOPDS_SERVER_LOG", os.path.join(settings.BASE_DIR,'opds_catalog/log/sopds_server.log'))
SCANNER_LOG = getattr(settings, "SOPDS_SCANNER_LOG", os.path.join(settings.BASE_DIR,'opds_catalog/log/sopds_scanner.log'))

# параметры SERVER_PID и SCANNER_PID задают размещение PID файлов этих процессов при демонизации
SERVER_PID = getattr(settings, "SOPDS_SERVER_PID", os.path.join(settings.BASE_DIR,'opds_catalog/tmp/sopds_server.pid'))
SCANNER_PID = getattr(settings, "SOPDS_SCANNER_PID", os.path.join(settings.BASE_DIR,'opds_catalog/tmp/sopds_scanner.pid'))

# SCAN_SHED устанавливают значения шедулера, для периодического сканирования коллекции книг
# при помощи manage.py sopds_scanner ...
# Возможные значения можно найти на следующей странице; 
# https://apscheduler.readthedocs.io/en/latest/modules/triggers/cron.html#module-apscheduler.triggers.cron
SCAN_SHED_MIN = getattr(settings, "SOPDS_SCAN_SHED_MIN", '0')
SCAN_SHED_HOUR = getattr(settings, "SOPDS_SCAN_SHED_HOUR", '0')
SCAN_SHED_DAY = getattr(settings, "SOPDS_SCAN_SHED_DAY", '*')
SCAN_SHED_DOW = getattr(settings, "SOPDS_SCAN_SHED_DOW", '*')
INPX_ENABLE = getattr(settings, "SOPDS_INPX_ENABLE", True)
INPX_SKIP_UNCHANGED = getattr(settings, "SOPDS_INPX_SKIP_UNCHANGED", True)
INPX_TEST_ZIP = getattr(settings, "SOPDS_INPX_TEST_ZIP", False)
INPX_TEST_FILES = getattr(settings, "SOPDS_TEST_FILES", False)

TITLE = getattr(settings, "SOPDS_TITLE", "SimpleOPDS")
SUBTITLE = getattr(settings, "SOPDS_SUBTITLE", "SimpleOPDS Catalog by www.sopds.ru. Version %s."%VERSION)
+22 −22

File changed.

Preview size limit exceeded, changes collapsed.

Loading