__init__.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from searx.plugins import self_ip
  2. from searx import logger
  3. from sys import exit
  4. logger = logger.getChild('plugins')
  5. required_attrs = (('name', str),
  6. ('description', str),
  7. ('default_on', bool))
  8. optional_attrs = (('js_dependencies', tuple),
  9. ('css_dependencies', tuple))
  10. class Plugin():
  11. default_on = False
  12. name = 'Default plugin'
  13. description = 'Default plugin description'
  14. class PluginStore():
  15. def __init__(self):
  16. self.plugins = []
  17. def __iter__(self):
  18. for plugin in self.plugins:
  19. yield plugin
  20. def register(self, *plugins):
  21. for plugin in plugins:
  22. for plugin_attr, plugin_attr_type in required_attrs:
  23. if not hasattr(plugin, plugin_attr) or not isinstance(getattr(plugin, plugin_attr), plugin_attr_type):
  24. logger.critical('missing attribute "{0}", cannot load plugin: {1}'.format(plugin_attr, plugin))
  25. exit(3)
  26. for plugin_attr, plugin_attr_type in optional_attrs:
  27. if not hasattr(plugin, plugin_attr) or not isinstance(getattr(plugin, plugin_attr), plugin_attr_type):
  28. setattr(plugin, plugin_attr, plugin_attr_type())
  29. plugin.id = plugin.name.replace(' ', '_')
  30. self.plugins.append(plugin)
  31. def call(self, plugin_type, request, *args, **kwargs):
  32. ret = True
  33. for plugin in request.user_plugins:
  34. if hasattr(plugin, plugin_type):
  35. ret = getattr(plugin, plugin_type)(request, *args, **kwargs)
  36. if not ret:
  37. break
  38. return ret
  39. plugins = PluginStore()
  40. plugins.register(self_ip)