X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=scripts%2Fml-search.py;h=eff58fbecc901d47bb1a2c8edea16eac81e70575;hb=514d7a6a405e2212dbc5798c66ff68a3bdcbd633;hp=985e6d7a1ce505ce13f23e699282ac9cec6dec42;hpb=6bae69f038f792834c7ac11f944aa7760bff5ee6;p=m_librarian.git diff --git a/scripts/ml-search.py b/scripts/ml-search.py index 985e6d7..eff58fb 100755 --- a/scripts/ml-search.py +++ b/scripts/ml-search.py @@ -5,14 +5,24 @@ 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, Language, 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 _ = translations.ugettext +def _get_values(args, *columns): + values = {} + for column in columns: + value = getattr(args, column) + if value: + values[column] = unicode(value, default_encoding) + return values + + def _guess_case_sensitivity(values): for value in values.values(): if not value.islower(): @@ -26,12 +36,8 @@ def _search_authors(case_sensitive, search_type, args): "Cannot search by names and full name at the same time\n") main_parser.print_help() sys.exit(1) - values = {} expressions = [] - for column in 'surname', 'name', 'misc_name': - value = getattr(args, column) - if value: - values[column] = unicode(value, default_encoding) + values = _get_values(args, 'surname', 'name', 'misc_name') if not values: value = args.fullname if value: @@ -52,15 +58,27 @@ def _search_authors(case_sensitive, search_type, args): def _search_books(case_sensitive, search_type, args): - values = {} - for column in 'title', 'series', 'archive', 'file': - value = getattr(args, column) - if value: - values[column] = unicode(value, default_encoding) + join_expressions = [] + values = _get_values(args, 'title', 'series', 'archive', 'file') if case_sensitive is None: - case_sensitive = _guess_case_sensitivity(values) + test_values = values.copy() + test_values.update(_get_values(args, 'ext', 'lang')) + 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) + if args.lang: + join_expressions.append(Book.j.language) + conditions = mk_search_conditions( + Language, search_type, case_sensitive, + {'name': args.lang}) + join_expressions.extend(conditions) for book in search_books(search_type, case_sensitive, values, - orderBy='title'): + join_expressions, + orderBy=('series', 'ser_no', 'title')): print book.title.encode(default_encoding) if args.details >= 1: print " ", _("Author(s)"), ":", @@ -105,11 +123,7 @@ def _search_extensions(case_sensitive, search_type, args): def _search_genres(case_sensitive, search_type, args): - values = {} - for column in 'name', 'title': - value = getattr(args, column) - if value: - values[column] = unicode(value, default_encoding) + values = _get_values(args, 'name', 'title') if case_sensitive is None: case_sensitive = _guess_case_sensitivity(values) for genre in search_genres(search_type, case_sensitive, values, @@ -164,6 +178,8 @@ 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.add_argument('-l', '--lang', help='search by language') parser.set_defaults(func=_search_books) parser = subparsers.add_parser('ext', help='Search extensions')