No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

utils.py 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # -*- coding: utf-8 -*-
  2. import pymongo
  3. from pymongo import MongoClient
  4. from lodel.context import LodelContext
  5. LodelContext.expose_modules(globals(), {
  6. 'lodel.settings.settings': [('Settings', 'settings')],
  7. 'lodel.logger': 'logger'})
  8. common_collections = {
  9. 'object': 'objects',
  10. 'relation': 'relation'
  11. }
  12. LODEL_SORT_OPERATORS_MAP = {
  13. 'ASC': pymongo.ASCENDING,
  14. 'DESC': pymongo.DESCENDING
  15. }
  16. MONGODB_SORT_OPERATORS_MAP = {
  17. 'ASC': 1,
  18. 'DESC': -1
  19. }
  20. MANDATORY_CONNECTION_ARGS = ('host', 'port', 'login', 'password', 'dbname')
  21. class MongoDbConnectionError(Exception):
  22. pass
  23. ##@brief Forge a mongodb uri connection string
  24. #@param host str : hostname
  25. #@param port int|str : port number
  26. #@param username str
  27. #@param password str
  28. #@param db_name str : the db to authenticate on (mongo as auth per db)
  29. #@param ro bool : if True open a read_only connection
  30. #@return a connection string
  31. #@see https://docs.mongodb.com/v2.4/reference/connection-string/#connection-string-options
  32. #@todo escape arguments
  33. def connection_string(host, port, username, password, db_name = None, ro = None):
  34. ret = 'mongodb://'
  35. if username != None:
  36. ret += username
  37. if password != None:
  38. ret += ':'+password
  39. ret+='@'
  40. elif password != None:
  41. raise RuntimeError("Password given but no username given...")
  42. host = 'localhost' if host is None else host
  43. ret += host
  44. if port is not None:
  45. ret += ':'+str(port)
  46. if db_name is not None:
  47. ret += '/'+db_name
  48. else:
  49. logger.warning("No database indicated. Huge chance for authentication \
  50. to fails")
  51. if ro:
  52. ret += '?readOnly='+str(bool(ro))
  53. return ret
  54. ##@brief Return an instanciated MongoClient from a connstring
  55. #@param connstring str : as returned by connection_string() method
  56. #@return A MongoClient instance
  57. def connect(connstring):
  58. return MongoClient(connstring)
  59. ## @brief Returns a collection name given a EmClass
  60. # @param class_object EmClass
  61. # @return str
  62. def object_collection_name(class_object):
  63. return class_object.__name__
  64. def collection_name(class_name):
  65. return class_name
  66. ## @brief Determine a collection field name given a lodel2 fieldname
  67. # @note For the moment this method only return the argument but EVERYWHERE
  68. # in the datasource we should use this method to gather proper fieldnames
  69. # @param fieldname str : A lodel2 fieldname
  70. # @return A string representing a well formated mongodb fieldname
  71. # @see mongo_filednames
  72. def mongo_fieldname(fieldname):
  73. return fieldname
  74. ## @brief Same as mongo_fieldname but for list of fields
  75. #
  76. # A small utility function
  77. # @param fieldnames iterable : contains str only
  78. # @return a list of converted fildnames (str)
  79. # @see mongo_fieldname
  80. def mongo_fieldnames(fieldnames):
  81. return [mongo_fieldname(fname) for fname in fieldnames]
  82. ## @brief Returns a list of orting options
  83. # @param query_filters_order list
  84. # @return list
  85. def parse_query_order(query_filters_order):
  86. return [(field, LODEL_SORT_OPERATORS_MAP[direction])
  87. for field, direction in query_filters_order]