]> git.phdru.name Git - m_librarian.git/commitdiff
Search books by extension
authorOleg Broytman <phd@phdru.name>
Mon, 23 May 2016 20:25:00 +0000 (23:25 +0300)
committerOleg Broytman <phd@phdru.name>
Mon, 23 May 2016 20:32:29 +0000 (23:32 +0300)
docs-ru/command_line.rst
docs/command_line.rst
m_librarian/search.py
scripts/ml-search.py

index a6f226b010991b94cd27b65bfd64139be08a91d9..4cb958fe5348ab06f640f7bdcd474cc081c478bf 100644 (file)
@@ -100,7 +100,7 @@ ml-search.py
 
 Использование::
 
-    ml-search.py [-i/-I] [-t/-s/-f] books [-t title] [-s series] [-a archive] [-f file] [-d]
+    ml-search.py [-i/-I] [-t/-s/-f] books [-t title] [-s series] [-a archive] [-f file] [-d] [-e ext]
 
 Искать и печатать список книг по заголовку, серии, архиву, имени файла.
 
@@ -113,6 +113,7 @@ ml-search.py
     -d, --details          Выводить больше информации о найденных книгах;
                            повторите эту опцию несколько раз, чтобы
                            получить ещё больше деталей
+    -e, --ext ext          Искать по расширению имени файла
 
 По умолчанию программы выводит список заголовков найденных книг. При
 использовании опции `-d` также выводится список авторов и жанров, а
index 97c0648a0f9c1c4babe36a1a27429acf15c2d762..99fb72ed0ec8c3b6ae4cb6e6a3e0d2ae8edf2441 100644 (file)
@@ -99,7 +99,7 @@ Book search
 
 Usage::
 
-    ml-search.py [-i/-I] [-t/-s/-f] books [-t title] [-s series] [-a archive] [-f file] [-d]
+    ml-search.py [-i/-I] [-t/-s/-f] books [-t title] [-s series] [-a archive] [-f file] [-d] [-e ext]
 
 Search and print a list of books by title, series, archive or file name.
 
@@ -111,6 +111,7 @@ Options::
     -f, --file file        Search by file name (without extension)
     -d, --details          Output more details about books;
                            repeat for even more details
+    -e, --ext ext          Search by file extension
 
 By default the program prints only titles of the found book. With one
 option `-d` it also prints the list of authors and genres, and also
index 5b289f089b3f303f7465d3c28c70dd7722a937a2..7572287759616f11cb2c7353dbc3779cabc6e61c 100644 (file)
@@ -40,16 +40,19 @@ _search_conditions_dict = {
 
 
 def mk_search_conditions(table, search_type, case_sensitive, values,
-                         expressions=None):
+                         expressions=None, join_expressions=None):
+    if join_expressions is None:
+        join_expressions = []
     return _mk_search_conditions_with_operator(
         table, case_sensitive, _search_conditions_dict[search_type],
-        values, expressions)
+        values, expressions) + join_expressions
 
 
 def _search(table, search_type, case_sensitive, values,
-            expressions=None, orderBy=None):
+            expressions=None, join_expressions=None, orderBy=None):
     conditions = mk_search_conditions(
-        table, search_type, case_sensitive, values, expressions=expressions)
+        table, search_type, case_sensitive, values, expressions=expressions,
+        join_expressions=join_expressions)
     return table.select(AND(*conditions), orderBy=orderBy)
 
 
@@ -59,9 +62,10 @@ def search_authors(search_type, case_sensitive, values,
                    expressions=None, orderBy=orderBy)
 
 
-def search_books(search_type, case_sensitive, values, orderBy=None):
+def search_books(search_type, case_sensitive, values, join_expressions=None,
+                 orderBy=None):
     return _search(Book, search_type, case_sensitive, values,
-                   orderBy=orderBy)
+                   join_expressions=join_expressions, orderBy=orderBy)
 
 
 def search_extensions(search_type, case_sensitive, values, orderBy=None):
index b4c01e2d717f3cc285e2f5a72093cac6a8ef5671..b5b34c41eed0dbc30a043bc364bad1748a64d5d9 100755 (executable)
@@ -5,8 +5,9 @@ import sys
 from sqlobject.sqlbuilder import CONCAT
 
 from m_lib.defenc import default_encoding
-from m_librarian.db import Author, open_db
-from m_librarian.search import search_authors, search_books, \
+from m_librarian.db import Author, Book, Extension, open_db
+from m_librarian.search import mk_search_conditions, \
+    search_authors, search_books, \
     search_extensions, search_genres, search_languages
 
 from m_librarian.translations import translations
@@ -53,13 +54,26 @@ def _search_authors(case_sensitive, search_type, args):
 
 def _search_books(case_sensitive, search_type, args):
     values = {}
+    join_expressions = []
     for column in 'title', 'series', 'archive', 'file':
         value = getattr(args, column)
         if value:
             values[column] = unicode(value, default_encoding)
     if case_sensitive is None:
-        case_sensitive = _guess_case_sensitivity(values)
+        test_values = values.copy()
+        for column in 'ext', :
+            value = getattr(args, column)
+            if value:
+                test_values[column] = unicode(value, default_encoding)
+        case_sensitive = _guess_case_sensitivity(test_values)
+    if args.ext:
+        join_expressions.append(Book.j.extension)
+        conditions = mk_search_conditions(
+            Extension, search_type, case_sensitive,
+            {'name': args.ext})
+        join_expressions.extend(conditions)
     for book in search_books(search_type, case_sensitive, values,
+                             join_expressions,
                              orderBy=('series', 'ser_no', 'title')):
         print book.title.encode(default_encoding)
         if args.details >= 1:
@@ -164,6 +178,7 @@ if __name__ == '__main__':
     parser.add_argument('-d', '--details', action='count',
                         help='output more details about books; '
                         'repeat for even more details')
+    parser.add_argument('-e', '--ext', help='search by file extension')
     parser.set_defaults(func=_search_books)
 
     parser = subparsers.add_parser('ext', help='Search extensions')