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():
"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:
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, 'surname', 'name', 'misc_name',
+ 'fullname', 'ext', 'lang'))
+ case_sensitive = _guess_case_sensitivity(test_values)
+ avalues = _get_values(args, 'surname', 'name', 'misc_name', 'fullname')
+ if avalues:
+ 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)
+ expressions = []
+ join_expressions.append(Book.j.authors)
+ value = args.fullname
+ if value:
+ expressions.append((
+ CONCAT(Author.q.surname, ' ', Author.q.name, ' ',
+ Author.q.misc_name),
+ unicode(value, default_encoding)
+ ))
+ conditions = mk_search_conditions(
+ Author, search_type, case_sensitive, avalues, expressions)
+ join_expressions.extend(conditions)
+ 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)"), ":",
print " ", _("Series"), ":",
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):
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,
parser.add_argument('-d', '--details', action='count',
help='output more details about books; '
'repeat for even more details')
+ parser.add_argument('--surname', help='search by author\'s surname')
+ parser.add_argument('--name', help='search by author\'s name')
+ parser.add_argument('--misc-name', help='search by author\'s misc. name')
+ parser.add_argument('--fullname', help='search by author\'s full name')
+ 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')