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():
25 getattr(getattr(table.q, column), comparison_op)(value))
26 for expr, value in expressions:
28 getattr(expr, comparison_op)(value))
30 for column, value in values.items():
35 getattr(table.q, column)),
36 comparison_op)(value.lower()))
37 for expr, value in expressions:
39 getattr(func.lower(expr), comparison_op)(value.lower()))
43 _search_conditions_dict = {
44 'start': 'startswith',
45 'substring': 'contains',
50 def mk_search_conditions(table, search_type, case_sensitive, values,
51 expressions=None, join_expressions=None):
52 if join_expressions is None:
54 return _mk_search_conditions_with_operator(
55 table, case_sensitive, _search_conditions_dict[search_type],
56 values, expressions) + join_expressions
59 def _search(table, search_type, case_sensitive, values,
60 expressions=None, join_expressions=None, orderBy=None):
61 conditions = mk_search_conditions(
62 table, search_type, case_sensitive, values, expressions=expressions,
63 join_expressions=join_expressions)
64 return table.select(AND(*conditions), orderBy=orderBy)
67 def search_authors(search_type, case_sensitive, values,
68 expressions=None, orderBy=None):
69 return _search(Author, search_type, case_sensitive, values,
70 expressions=expressions, orderBy=orderBy)
73 def search_books(search_type, case_sensitive, values, join_expressions=None,
75 return _search(Book, search_type, case_sensitive, values,
76 join_expressions=join_expressions, orderBy=orderBy)
79 def search_extensions(search_type, case_sensitive, values, orderBy=None):
80 return _search(Extension, search_type, case_sensitive, values,
84 def search_genres(search_type, case_sensitive, values, orderBy=None):
85 return _search(Genre, search_type, case_sensitive, values,
89 def search_languages(search_type, case_sensitive, values, orderBy=None):
90 return _search(Language, search_type, case_sensitive, values,