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 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. # -*- coding: utf-8 -*-
  2. import pymongo
  3. from pymongo import MongoClient
  4. from lodel.settings.settings import Settings as settings
  5. common_collections = {
  6. 'object': 'objects',
  7. 'relation': 'relation'
  8. }
  9. collection_prefix = {
  10. 'relation': 'rel_',
  11. 'object': 'class_'
  12. }
  13. LODEL_SORT_OPERATORS_MAP = {
  14. 'ASC': pymongo.ASCENDING,
  15. 'DESC': pymongo.DESCENDING
  16. }
  17. MONGODB_SORT_OPERATORS_MAP = {
  18. 'ASC': 1,
  19. 'DESC': -1
  20. }
  21. MANDATORY_CONNECTION_ARGS = ('host', 'port', 'login', 'password', 'dbname')
  22. class MongoDbConnectionError(Exception):
  23. pass
  24. ## @brief gets the settings given a connection name
  25. # @param connection_name str
  26. # @return dict
  27. # @todo Use the settings module to store the connections parameters
  28. def get_connection_args(connnection_name='default'):
  29. return {'host': 'localhost', 'port': 28015, 'login': 'lodel_admin', 'password': 'lapwd', 'dbname': 'lodel'}
  30. ## @brief Creates a connection to a MongoDb Database
  31. # @param connection_name str
  32. # @return MongoClient
  33. '''def mongodbconnect(connection_name):
  34. login, password, host, port, dbname = get_connection_args(connection_name)
  35. return connect(host, port, dbname, login, password)
  36. '''
  37. def connection_string(host, port, db_name, username, password):
  38. return 'mongodb://%s:%s@%s:%s' % (username, password, host, port)
  39. def connection(host, port, username, password):
  40. return MongoClient(connection_string(host, port, '', username, password))
  41. def connect(host, port, db_name, username, password):
  42. conn = connection(host, port, username, password)
  43. database = conn[db_name]
  44. return database
  45. ## @brief Returns a collection name given a EmClass
  46. # @param class_object EmClass
  47. # @return str
  48. def object_collection_name(class_object):
  49. if not class_object.pure_abstract:
  50. class_parent = class_object.parents[0].uid
  51. collection_name = ("%s%s" % (collection_prefix['object'], class_parent)).lower()
  52. else:
  53. collection_name = ("%s%s" % (collection_prefix['object'], class_object.name)).lower()
  54. return collection_name
  55. ## @brief Determine a collection field name given a lodel2 fieldname
  56. # @note For the moment this method only return the argument but EVERYWHERE
  57. # in the datasource we should use this method to gather proper fieldnames
  58. # @param fieldname str : A lodel2 fieldname
  59. # @return A string representing a well formated mongodb fieldname
  60. # @see mongo_filednames
  61. def mongo_fieldname(fieldname):
  62. return fieldname
  63. ## @brief Same as mongo_fieldname but for list of fields
  64. #
  65. # A small utility function
  66. # @param fieldnames iterable : contains str only
  67. # @return a list of converted fildnames (str)
  68. # @see mongo_fieldname
  69. def mongo_fieldnames(fieldnames):
  70. return [mongo_fieldname(fname) for fname in fieldnames]
  71. ## @brief Returns a list of orting options
  72. # @param query_filters_order list
  73. # @return list
  74. def parse_query_order(query_filters_order):
  75. return [(field, LODEL_SORT_OPERATORS_MAP[direction])
  76. for field, direction in query_filters_order]