mongodb.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. # SPDX-License-Identifier: AGPL-3.0-or-later
  2. """
  3. MongoDB engine (Offline)
  4. """
  5. # pylint: disable=missing-function-docstring
  6. # pylint: disable=import-error
  7. import re
  8. from pymongo import MongoClient
  9. engine_type = 'offline'
  10. paging = True
  11. # mongodb connection variables
  12. host = '127.0.0.1'
  13. port = 27017
  14. username = ''
  15. password = ''
  16. database = None
  17. collection = None
  18. key = None
  19. # engine specific variables
  20. results_per_page = 20
  21. exact_match_only = False
  22. result_template = 'key-value.html'
  23. _client = None
  24. def init(_):
  25. connect()
  26. def connect():
  27. global _client
  28. kwargs = {
  29. 'port': port,
  30. }
  31. if username:
  32. kwargs['username'] = username
  33. if password:
  34. kwargs['password'] = password
  35. _client = MongoClient(host, **kwargs)[database][collection]
  36. def search(query, params):
  37. ret = []
  38. if exact_match_only:
  39. q = {'$eq': query}
  40. else:
  41. q = {'$regex': re.compile('.*{0}.*'.format(re.escape(query)), re.I | re.M)}
  42. results = _client.find({key: q})\
  43. .skip((params['pageno'] - 1) * results_per_page)\
  44. .limit(results_per_page)
  45. ret.append({'number_of_results': results.count()})
  46. for r in results:
  47. del r['_id']
  48. r = {str(k): str(v) for k, v in r.items()}
  49. r['template'] = result_template
  50. ret.append(r)
  51. return ret