models.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. )
  30. def __init__(
  31. self,
  32. query: str,
  33. engineref_list: typing.List[EngineRef],
  34. lang: str = 'all',
  35. safesearch: int = 0,
  36. pageno: int = 1,
  37. time_range: typing.Optional[str] = None,
  38. timeout_limit: typing.Optional[float] = None,
  39. external_bang: typing.Optional[str] = None,
  40. engine_data: typing.Optional[typing.Dict[str, str]] = None,
  41. ):
  42. self.query = query
  43. self.engineref_list = engineref_list
  44. self.lang = lang
  45. self.safesearch = safesearch
  46. self.pageno = pageno
  47. self.time_range = time_range
  48. self.timeout_limit = timeout_limit
  49. self.external_bang = external_bang
  50. self.engine_data = engine_data or {}
  51. self.locale = None
  52. if self.lang:
  53. try:
  54. self.locale = babel.Locale.parse(self.lang, sep='-')
  55. except babel.core.UnknownLocaleError:
  56. pass
  57. @property
  58. def categories(self):
  59. return list(set(map(lambda engineref: engineref.category, self.engineref_list)))
  60. def __repr__(self):
  61. return "SearchQuery({!r}, {!r}, {!r}, {!r}, {!r}, {!r}, {!r}, {!r})".format(
  62. self.query,
  63. self.engineref_list,
  64. self.lang,
  65. self.safesearch,
  66. self.pageno,
  67. self.time_range,
  68. self.timeout_limit,
  69. self.external_bang,
  70. )
  71. def __eq__(self, other):
  72. return (
  73. self.query == other.query
  74. and self.engineref_list == other.engineref_list
  75. and self.lang == other.lang
  76. and self.safesearch == other.safesearch
  77. and self.pageno == other.pageno
  78. and self.time_range == other.time_range
  79. and self.timeout_limit == other.timeout_limit
  80. and self.external_bang == other.external_bang
  81. )
  82. def __hash__(self):
  83. return hash(
  84. (
  85. self.query,
  86. tuple(self.engineref_list),
  87. self.lang,
  88. self.safesearch,
  89. self.pageno,
  90. self.time_range,
  91. self.timeout_limit,
  92. self.external_bang,
  93. )
  94. )