]> git.phdru.name Git - m_librarian.git/blob - scripts/ml-search.py
Search extensions
[m_librarian.git] / scripts / ml-search.py
1 #! /usr/bin/env python
2
3 import argparse
4 import sys
5 from sqlobject.sqlbuilder import CONCAT
6
7 from m_lib.defenc import default_encoding
8 from m_librarian.db import Author, open_db
9 from m_librarian.search import search_authors, search_extensions
10
11 from m_librarian.translations import translations
12 _ = translations.ugettext
13
14
15 def _guess_case_sensitivity(values):
16     for value in values.values():
17         if not value.islower():
18             return True
19     return False
20
21
22 def _search_authors(case_sensitive, args):
23     if (args.surname or args.name or args.misc_name) and args.fullname:
24         sys.stderr.write(
25             "Cannot search by names and full name at the same time\n")
26         main_parser.print_help()
27         sys.exit(1)
28     values = {}
29     expressions = []
30     for column in 'surname', 'name', 'misc_name':
31         value = getattr(args, column)
32         if value:
33             values[column] = unicode(value, default_encoding)
34     if not values:
35         value = args.fullname
36         if value:
37             expressions.append((
38                 CONCAT(Author.q.surname, ' ', Author.q.name, ' ',
39                        Author.q.misc_name),
40                 unicode(value, default_encoding)
41             ))
42     if case_sensitive is None:
43         case_sensitive = _guess_case_sensitivity(values)
44     for author in search_authors(args.search_type, case_sensitive, values,
45                                  expressions):
46         names = filter(None, (author.surname, author.name, author.misc_name))
47         fullname = u' '.join(names)
48         print fullname.encode(default_encoding), \
49             (u"(%s: %d)" % (_('books'), author.count)).encode(default_encoding)
50
51
52 def _search_extensions(case_sensitive, args):
53     values = {'name': args.name}
54     if case_sensitive is None:
55         case_sensitive = _guess_case_sensitivity(values)
56     for ext in search_extensions(args.search_type, case_sensitive, values):
57         print ext.name.encode(default_encoding), \
58             (u"(%s: %d)" % (_('books'), ext.count)).encode(default_encoding)
59
60
61 if __name__ == '__main__':
62     main_parser = argparse.ArgumentParser(description='Search')
63     main_parser.add_argument('-i', '--ignore-case',
64                              action='store_true',
65                              help='ignore case '
66                              '(default is to guess)')
67     main_parser.add_argument('-I', '--case-sensitive',
68                              action='store_true',
69                              help='don\'t ignore case ')
70     main_parser.add_argument('-t', '--search-type',
71                              choices=['exact', 'start', 'substring'],
72                              default='start',
73                              help='search type: '
74                              'exact match, substring at the start '
75                              '(this is the default), substring anywhere')
76     subparsers = main_parser.add_subparsers(help='Commands')
77
78     parser = subparsers.add_parser('authors', help='Search authors')
79     parser.add_argument('-s', '--surname', help='search by surname')
80     parser.add_argument('-n', '--name', help='search by name')
81     parser.add_argument('-m', '--misc-name', help='search by misc. name')
82     parser.add_argument('fullname', nargs='?', help='search by full name')
83     parser.set_defaults(func=_search_authors)
84
85     parser = subparsers.add_parser('ext', help='Search extensions')
86     parser.add_argument('name', help='search by name')
87     parser.set_defaults(func=_search_extensions)
88
89     args = main_parser.parse_args()
90     if args.case_sensitive:
91         if args.ignore_case:
92             sys.stderr.write(
93                 "Cannot search case sensitive and case insensitive "
94                 "at the same time\n")
95             main_parser.print_help()
96             sys.exit(1)
97         else:
98             case_sensitive = True
99     elif args.ignore_case:
100         case_sensitive = False
101     else:
102         case_sensitive = None  # guess case sensitivity
103     open_db()
104     args.func(case_sensitive, args)