settings.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. ########################################################################
  2. # Searx-Qt - Lightweight desktop application for Searx.
  3. # Copyright (C) 2020-2022 CYBERDEViL
  4. #
  5. # This file is part of Searx-Qt.
  6. #
  7. # Searx-Qt is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU General Public License as published by
  9. # the Free Software Foundation, either version 3 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # Searx-Qt is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU General Public License
  18. # along with this program. If not, see <https://www.gnu.org/licenses/>.
  19. #
  20. ########################################################################
  21. from PyQt5.QtCore import QObject, pyqtSignal
  22. from searxqt.themes import Themes
  23. from searxqt.core.instances import Stats2
  24. from searxqt.core import log
  25. class General:
  26. def serialize():
  27. return {
  28. 'logLevel': log.LogLevel,
  29. 'themes': Themes.serialize()
  30. }
  31. def deserialize(data):
  32. # Populate / re-populate user and system themes
  33. Themes.populate()
  34. themesData = data.get('themes', {})
  35. if themesData:
  36. Themes.deserialize(themesData)
  37. # Log level
  38. logLevel = data.get('logLevel', None)
  39. if logLevel is not None:
  40. log.LogLevel = logLevel
  41. else:
  42. log.LogLevel = log.LogLevels.QUIET
  43. class SettingsModel(QObject):
  44. changed = pyqtSignal()
  45. def __init__(self, requestSettings, imgRequestSettings, parent=None):
  46. QObject.__init__(self, parent=parent)
  47. self._requests = RequestSettingsModel(requestSettings)
  48. self._imgRequests = RequestSettingsModel(imgRequestSettings)
  49. self._stats2 = None
  50. self._requests.changed.connect(self.changed)
  51. def loadSettings(self, data, stats2=True):
  52. self.requests.data = data.get('requests', {})
  53. self.imgRequests.data = data.get('imgRequests', {})
  54. if self._stats2:
  55. self._stats2.deleteLater()
  56. self._stats2 = None
  57. if stats2:
  58. self._stats2 = SearxStats2Model()
  59. stats2Data = data.get('stats2', {})
  60. self.stats2.loadSettings(stats2Data)
  61. General.deserialize(data.get('general', {}))
  62. def saveSettings(self):
  63. if self._stats2:
  64. return {
  65. 'general': General.serialize(),
  66. 'requests': self.requests.data,
  67. 'imgRequests': self.imgRequests.data,
  68. 'stats2': self.stats2.saveSettings()
  69. }
  70. return {
  71. 'general': General.serialize(),
  72. 'requests': self.requests.data,
  73. 'imgRequests': self.imgRequests.data
  74. }
  75. @property
  76. def requests(self): return self._requests
  77. @property
  78. def imgRequests(self): return self._imgRequests
  79. @property
  80. def stats2(self): return self._stats2
  81. class SearxStats2Model(QObject):
  82. changed = pyqtSignal()
  83. def __init__(self, parent=None):
  84. QObject.__init__(self, parent=parent)
  85. self._backupUrl = Stats2.URL
  86. def loadSettings(self, data):
  87. self.url = data.get('url', self._backupUrl)
  88. def saveSettings(self):
  89. return {
  90. 'url': self.url
  91. }
  92. def reset(self):
  93. self.url = self._backupUrl
  94. @property
  95. def url(self):
  96. return Stats2.URL
  97. @url.setter
  98. def url(self, url):
  99. Stats2.URL = url
  100. self.changed.emit()
  101. class RequestSettingsModel(QObject):
  102. changed = pyqtSignal()
  103. # @param requestSettings: TODO
  104. # @type requestSettings: core.requests.RequestSettings
  105. def __init__(self, requestSettings, parent=None):
  106. QObject.__init__(self, parent=parent)
  107. self._settings = requestSettings
  108. def __changed(self):
  109. self._settings.updateRequestKwargs()
  110. self.changed.emit()
  111. def __getattr__(self, key):
  112. if key == "data":
  113. return self._settings.getData()
  114. return getattr(self._settings, key)
  115. def __setattr__(self, key, value):
  116. if key == "useragents":
  117. self._settings.useragents.clear()
  118. for ua in value:
  119. self._settings.useragents.append(ua)
  120. self.__changed()
  121. return
  122. if key == "data":
  123. self._settings.setData(value)
  124. return
  125. if key == "_settings":
  126. super().__setattr__(key, value)
  127. return
  128. setattr(self._settings, key, value)
  129. self.__changed()