X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=scripts%2Fml-search.py;h=47b1a8ca7f6d278551a3f9e9df312f139accd975;hb=97549cb224c6ab97fc688ad6b77a32804daec989;hp=07563b94200187c70e97b1883fdfe6d5d601f82f;hpb=4524177fe242fe12576af657b84b94ea123c1a30;p=m_librarian.git diff --git a/scripts/ml-search.py b/scripts/ml-search.py index 07563b9..47b1a8c 100755 --- a/scripts/ml-search.py +++ b/scripts/ml-search.py @@ -2,9 +2,12 @@ import argparse import sys +from sqlobject.sqlbuilder import CONCAT + from m_lib.defenc import default_encoding -from m_librarian.db import open_db -from m_librarian.search import search_authors +from m_librarian.db import Author, open_db +from m_librarian.search import search_authors, search_extensions + from m_librarian.translations import translations _ = translations.ugettext @@ -17,21 +20,44 @@ def _guess_case_sensitivity(values): def _search_authors(case_sensitive, args): + if (args.surname or args.name or args.misc_name) and args.fullname: + sys.stderr.write( + "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) + if not values: + value = args.fullname + if value: + expressions.append(( + CONCAT(Author.q.surname, ' ', Author.q.name, ' ', + Author.q.misc_name), + unicode(value, default_encoding) + )) if case_sensitive is None: case_sensitive = _guess_case_sensitivity(values) - for author in search_authors(args.search_type, case_sensitive, values): - full_name = filter(None, - (author.surname, author.name, author.misc_name)) - full_name = u' '.join(full_name) - print full_name.encode(default_encoding), \ + for author in search_authors(args.search_type, case_sensitive, values, + expressions): + names = filter(None, (author.surname, author.name, author.misc_name)) + fullname = u' '.join(names) + print fullname.encode(default_encoding), \ (u"(%s: %d)" % (_('books'), author.count)).encode(default_encoding) +def _search_extensions(case_sensitive, args): + values = {'name': args.name} + if case_sensitive is None: + case_sensitive = _guess_case_sensitivity(values) + for ext in search_extensions(args.search_type, case_sensitive, values): + print ext.name.encode(default_encoding), \ + (u"(%s: %d)" % (_('books'), ext.count)).encode(default_encoding) + + if __name__ == '__main__': main_parser = argparse.ArgumentParser(description='Search') main_parser.add_argument('-i', '--ignore-case', @@ -53,8 +79,13 @@ if __name__ == '__main__': parser.add_argument('-s', '--surname', help='search by surname') parser.add_argument('-n', '--name', help='search by name') parser.add_argument('-m', '--misc-name', help='search by misc. name') + parser.add_argument('fullname', nargs='?', help='search by full name') parser.set_defaults(func=_search_authors) + parser = subparsers.add_parser('ext', help='Search extensions') + parser.add_argument('name', help='search by name') + parser.set_defaults(func=_search_extensions) + args = main_parser.parse_args() if args.case_sensitive: if args.ignore_case: