2 from sqlobject.sqlbuilder import AND, func
3 from .db import Author, Book, Extension, Genre, Language
6 'mk_search_conditions',
7 'search_authors', 'search_books', 'search_extensions',
8 'search_genres', 'search_languages',
12 def _mk_search_conditions_with_operator(table, case_sensitive, comparison_op,
14 if expressions is None:
17 for column, value in values.items():
19 _expressions.append(table.q.id == value)
21 for column, value in values.items():
24 getattr(getattr(table.q, column), comparison_op)(value))
25 for expr, value in expressions:
27 getattr(expr, comparison_op)(value))
29 for column, value in values.items():
33 getattr(table.q, column)),
34 comparison_op)(value.lower()))
35 for expr, value in expressions:
37 getattr(func.lower(expr), comparison_op)(value.lower()))
41 _search_conditions_dict = {
42 'start': 'startswith',
43 'substring': 'contains',
48 def mk_search_conditions(table, search_type, case_sensitive, values,
49 expressions=None, join_expressions=None):
50 if join_expressions is None:
52 return _mk_search_conditions_with_operator(
53 table, case_sensitive, _search_conditions_dict[search_type],
54 values, expressions) + join_expressions
57 def _search(table, search_type, case_sensitive, values,
58 expressions=None, join_expressions=None, orderBy=None):
59 conditions = mk_search_conditions(
60 table, search_type, case_sensitive, values, expressions=expressions,
61 join_expressions=join_expressions)
62 return table.select(AND(*conditions), orderBy=orderBy)
65 def search_authors(search_type, case_sensitive, values,
66 expressions=None, orderBy=None):
67 return _search(Author, search_type, case_sensitive, values,
68 expressions=expressions, orderBy=orderBy)
71 def search_books(search_type, case_sensitive, values, join_expressions=None,
73 return _search(Book, search_type, case_sensitive, values,
74 join_expressions=join_expressions, orderBy=orderBy)
77 def search_extensions(search_type, case_sensitive, values, orderBy=None):
78 return _search(Extension, search_type, case_sensitive, values,
82 def search_genres(search_type, case_sensitive, values, orderBy=None):
83 return _search(Genre, search_type, case_sensitive, values,
87 def search_languages(search_type, case_sensitive, values, orderBy=None):
88 return _search(Language, search_type, case_sensitive, values,