X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=scripts%2Fml-search.py;h=eff58fbecc901d47bb1a2c8edea16eac81e70575;hb=514d7a6a405e2212dbc5798c66ff68a3bdcbd633;hp=bdb1d9dd6d63817cc05a7ec4a323a61181800888;hpb=09f49faa484b5091be175823e406cbebb4162e3a;p=m_librarian.git diff --git a/scripts/ml-search.py b/scripts/ml-search.py index bdb1d9d..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,17 +58,29 @@ 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 > 0: + if args.details >= 1: print " ", _("Author(s)"), ":", for author in book.authors: names = filter(None, @@ -79,6 +97,17 @@ def _search_books(case_sensitive, search_type, args): print book.series.encode(default_encoding), \ "(%d)" % book.ser_no + if args.details >= 2: + print " ", _("Date"), ":", book.date + print " ", _("Language"), ":", book.language.name + + if args.details >= 3: + print " ", _("Archive"), ":", book.archive + print " ", _("File"), ":", book.file + print " ", _("Extension"), ":", book.extension.name + print " ", _("Size"), ":", book.size, _("bytes") + print " ", _("Deleted"), ":", _(str(book.deleted)) + def _search_extensions(case_sensitive, search_type, args): if args.name: @@ -94,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, @@ -153,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')