]> git.phdru.name Git - m_librarian.git/blob - scripts/ml-search.py
Search authors by full name
[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
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     values = {}
24     expressions = []
25     for column in 'surname', 'name', 'misc_name':
26         value = getattr(args, column)
27         if value:
28             values[column] = unicode(value, default_encoding)
29     if not values:
30         value = args.fullname
31         if value:
32             expressions.append((
33                 CONCAT(Author.q.surname, ' ', Author.q.name, ' ',
34                        Author.q.misc_name),
35                 unicode(value, default_encoding)
36             ))
37     if case_sensitive is None:
38         case_sensitive = _guess_case_sensitivity(values)
39     for author in search_authors(args.search_type, case_sensitive, values,
40                                  expressions):
41         names = filter(None, (author.surname, author.name, author.misc_name))
42         fullname = u' '.join(names)
43         print fullname.encode(default_encoding), \
44             (u"(%s: %d)" % (_('books'), author.count)).encode(default_encoding)
45
46
47 if __name__ == '__main__':
48     main_parser = argparse.ArgumentParser(description='Search')
49     main_parser.add_argument('-i', '--ignore-case',
50                              action='store_true',
51                              help='ignore case '
52                              '(default is to guess)')
53     main_parser.add_argument('-I', '--case-sensitive',
54                              action='store_true',
55                              help='don\'t ignore case ')
56     main_parser.add_argument('-t', '--search-type',
57                              choices=['exact', 'start', 'substring'],
58                              default='start',
59                              help='search type: '
60                              'exact match, substring at the start '
61                              '(this is the default), substring anywhere')
62     subparsers = main_parser.add_subparsers(help='Commands')
63
64     parser = subparsers.add_parser('authors', help='Search authors')
65     parser.add_argument('-s', '--surname', help='search by surname')
66     parser.add_argument('-n', '--name', help='search by name')
67     parser.add_argument('-m', '--misc-name', help='search by misc. name')
68     parser.add_argument('fullname', nargs='?', help='search by full name')
69     parser.set_defaults(func=_search_authors)
70
71     args = main_parser.parse_args()
72     if args.case_sensitive:
73         if args.ignore_case:
74             sys.stderr.write(
75                 "Cannot search case sensitive and case insensitive "
76                 "at the same time\n")
77             main_parser.print_help()
78             sys.exit(1)
79         else:
80             case_sensitive = True
81     elif args.ignore_case:
82         case_sensitive = False
83     else:
84         case_sensitive = None  # guess case sensitivity
85     if (args.surname or args.name or args.misc_name) and args.fullname:
86         sys.stderr.write(
87             "Cannot search by names and full name at the same time\n")
88         main_parser.print_help()
89         sys.exit(1)
90     open_db()
91     args.func(case_sensitive, args)