models.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. import typing
  3. import babel
  4. class EngineRef:
  5. """Reference by names to an engine and category"""
  6. __slots__ = 'name', 'category'
  7. def __init__(self, name: str, category: str):
  8. self.name = name
  9. self.category = category
  10. def __repr__(self):
  11. return "EngineRef({!r}, {!r})".format(self.name, self.category)
  12. def __eq__(self, other):
  13. return self.name == other.name and self.category == other.category
  14. def __hash__(self):
  15. return hash((self.name, self.category))
  16. class SearchQuery:
  17. """container for all the search parameters (query, language, etc...)"""
  18. __slots__ = (
  19. 'query',
  20. 'engineref_list',
  21. 'lang',
  22. 'locale',
  23. 'safesearch',
  24. 'pageno',
  25. 'time_range',
  26. 'timeout_limit',
  27. 'external_bang',
  28. 'engine_data',
  29. 'redirect_to_first_result',
  30. )
  31. def __init__(
  32. self,
  33. query: str,
  34. engineref_list: typing.List[EngineRef],
  35. lang: str = 'all',
  36. safesearch: int = 0,
  37. pageno: int = 1,
  38. time_range: typing.Optional[str] = None,
  39. timeout_limit: typing.Optional[float] = None,
  40. external_bang: typing.Optional[str] = None,
  41. engine_data: typing.Optional[typing.Dict[str, str]] = None,
  42. redirect_to_first_result: typing.Optional[bool] = None,
  43. ):
  44. self.query = query
  45. self.engineref_list = engineref_list
  46. self.lang = lang
  47. self.safesearch = safesearch
  48. self.pageno = pageno
  49. self.time_range = time_range
  50. self.timeout_limit = timeout_limit
  51. self.external_bang = external_bang
  52. self.engine_data = engine_data or {}
  53. self.redirect_to_first_result = redirect_to_first_result
  54. self.locale = None
  55. if self.lang:
  56. try:
  57. self.locale = babel.Locale.parse(self.lang, sep='-')
  58. except babel.core.UnknownLocaleError:
  59. pass
  60. @property
  61. def categories(self):
  62. return list(set(map(lambda engineref: engineref.category, self.engineref_list)))
  63. def __repr__(self):
  64. return "SearchQuery({!r}, {!r}, {!r}, {!r}, {!r}, {!r}, {!r}, {!r}, {!r})".format(
  65. self.query,
  66. self.engineref_list,
  67. self.lang,
  68. self.safesearch,
  69. self.pageno,
  70. self.time_range,
  71. self.timeout_limit,
  72. self.external_bang,
  73. self.redirect_to_first_result,
  74. )
  75. def __eq__(self, other):
  76. return (
  77. self.query == other.query
  78. and self.engineref_list == other.engineref_list
  79. and self.lang == other.lang
  80. and self.safesearch == other.safesearch
  81. and self.pageno == other.pageno
  82. and self.time_range == other.time_range
  83. and self.timeout_limit == other.timeout_limit
  84. and self.external_bang == other.external_bang
  85. and self.redirect_to_first_result == other.redirect_to_first_result
  86. )
  87. def __hash__(self):
  88. return hash(
  89. (
  90. self.query,
  91. tuple(self.engineref_list),
  92. self.lang,
  93. self.safesearch,
  94. self.pageno,
  95. self.time_range,
  96. self.timeout_limit,
  97. self.external_bang,
  98. self.redirect_to_first_result,
  99. )
  100. )
  101. def __copy__(self):
  102. return SearchQuery(
  103. self.query,
  104. self.engineref_list,
  105. self.lang,
  106. self.safesearch,
  107. self.pageno,
  108. self.time_range,
  109. self.timeout_limit,
  110. self.external_bang,
  111. self.engine_data,
  112. self.redirect_to_first_result,
  113. )