MambuPy 2.0.0b48__tar.gz → 2.0.0b50__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/__init__.py +1 -2
  2. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/__init__.py +4 -1
  3. {MambuPy-2.0.0b48/mambupy → MambuPy-2.0.0b50/MambuPy}/api/connector/rest.py +5 -6
  4. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/entities.py +2 -4
  5. {MambuPy-2.0.0b48/mambupy → MambuPy-2.0.0b50/MambuPy}/api/mambustruct.py +2 -1
  6. {MambuPy-2.0.0b48/mambupy → MambuPy-2.0.0b50/MambuPy}/mambuconfig.py +7 -0
  7. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/mambuutil.py +55 -85
  8. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy.egg-info/PKG-INFO +2 -2
  9. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy.egg-info/requires.txt +2 -1
  10. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/PKG-INFO +2 -2
  11. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/__init__.py +1 -2
  12. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/__init__.py +4 -1
  13. {MambuPy-2.0.0b48/MambuPy → MambuPy-2.0.0b50/mambupy}/api/connector/rest.py +5 -6
  14. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/entities.py +2 -4
  15. {MambuPy-2.0.0b48/MambuPy → MambuPy-2.0.0b50/mambupy}/api/mambustruct.py +2 -1
  16. {MambuPy-2.0.0b48/MambuPy → MambuPy-2.0.0b50/mambupy}/mambuconfig.py +7 -0
  17. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/mambuutil.py +55 -85
  18. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/setup.py +3 -2
  19. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/LICENSE +0 -0
  20. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/classes.py +0 -0
  21. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/connector/__init__.py +0 -0
  22. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/connector/mambuconnector.py +0 -0
  23. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/interfaces.py +0 -0
  24. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/mambubranch.py +0 -0
  25. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/mambucentre.py +0 -0
  26. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/mambuclient.py +0 -0
  27. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/mambucustomfield.py +0 -0
  28. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/mambugroup.py +0 -0
  29. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/mambuloan.py +0 -0
  30. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/mambuproduct.py +0 -0
  31. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/mamburole.py +0 -0
  32. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/mambutask.py +0 -0
  33. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/mambutransaction.py +0 -0
  34. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/mambuuser.py +0 -0
  35. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/api/vos.py +0 -0
  36. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/mambugeturl.py +0 -0
  37. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/__init__.py +0 -0
  38. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_activities.py +0 -0
  39. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_addresses.py +0 -0
  40. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_branches.py +0 -0
  41. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_centres.py +0 -0
  42. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_clients.py +0 -0
  43. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_customfields.py +0 -0
  44. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_dummies.py +0 -0
  45. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_groups.py +0 -0
  46. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_loans.py +0 -0
  47. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_mambu.py +0 -0
  48. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_orm.py +0 -0
  49. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_tasks.py +0 -0
  50. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/orm/schema_users.py +0 -0
  51. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/__init__.py +0 -0
  52. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/mambubranch.py +0 -0
  53. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/mambucentre.py +0 -0
  54. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/mambuclient.py +0 -0
  55. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/mambugroup.py +0 -0
  56. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/mambuloan.py +0 -0
  57. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/mambuproduct.py +0 -0
  58. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/mamburepayment.py +0 -0
  59. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/mambustruct.py +0 -0
  60. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/mambutask.py +0 -0
  61. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/mambutransaction.py +0 -0
  62. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/rest1to2/mambuuser.py +0 -0
  63. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/utils/__init__.py +0 -0
  64. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/utils/logging_config.py +0 -0
  65. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy/utils/userdeactivate.py +0 -0
  66. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy.egg-info/SOURCES.txt +0 -0
  67. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy.egg-info/dependency_links.txt +0 -0
  68. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/MambuPy.egg-info/top_level.txt +0 -0
  69. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/README.md +0 -0
  70. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/classes.py +0 -0
  71. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/connector/__init__.py +0 -0
  72. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/connector/mambuconnector.py +0 -0
  73. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/interfaces.py +0 -0
  74. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/mambubranch.py +0 -0
  75. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/mambucentre.py +0 -0
  76. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/mambuclient.py +0 -0
  77. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/mambucustomfield.py +0 -0
  78. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/mambugroup.py +0 -0
  79. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/mambuloan.py +0 -0
  80. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/mambuproduct.py +0 -0
  81. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/mamburole.py +0 -0
  82. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/mambutask.py +0 -0
  83. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/mambutransaction.py +0 -0
  84. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/mambuuser.py +0 -0
  85. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/api/vos.py +0 -0
  86. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/mambugeturl.py +0 -0
  87. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/__init__.py +0 -0
  88. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_activities.py +0 -0
  89. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_addresses.py +0 -0
  90. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_branches.py +0 -0
  91. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_centres.py +0 -0
  92. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_clients.py +0 -0
  93. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_customfields.py +0 -0
  94. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_dummies.py +0 -0
  95. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_groups.py +0 -0
  96. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_loans.py +0 -0
  97. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_mambu.py +0 -0
  98. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_orm.py +0 -0
  99. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_tasks.py +0 -0
  100. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/orm/schema_users.py +0 -0
  101. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/__init__.py +0 -0
  102. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/mambubranch.py +0 -0
  103. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/mambucentre.py +0 -0
  104. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/mambuclient.py +0 -0
  105. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/mambugroup.py +0 -0
  106. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/mambuloan.py +0 -0
  107. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/mambuproduct.py +0 -0
  108. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/mamburepayment.py +0 -0
  109. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/mambustruct.py +0 -0
  110. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/mambutask.py +0 -0
  111. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/mambutransaction.py +0 -0
  112. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/rest1to2/mambuuser.py +0 -0
  113. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/utils/__init__.py +0 -0
  114. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/utils/logging_config.py +0 -0
  115. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/mambupy/utils/userdeactivate.py +0 -0
  116. {MambuPy-2.0.0b48 → MambuPy-2.0.0b50}/setup.cfg +0 -0
@@ -9,7 +9,6 @@
9
9
  MambuPy.orm
10
10
  MambuPy.api
11
11
  MambuPy.api.connector
12
- MambuPy.rest1to2
13
12
 
14
13
 
15
14
  Currently, there are two different ways to access Mambu objects:
@@ -35,5 +34,5 @@ TODOS
35
34
  to achive TDD when implementing features or correcting bugs.
36
35
  """
37
36
 
38
- __version__ = "2.0.0b48"
37
+ __version__ = "2.0.0b50"
39
38
  """The version of this module."""
@@ -10,13 +10,16 @@ Objects using `Mambu REST API <https://api.mambu.com/?python>`_
10
10
  MambuPy.api.interfaces
11
11
  MambuPy.api.vos
12
12
  MambuPy.api.mambustruct
13
+ MambuPy.api.mambuproduct
13
14
  MambuPy.api.mambuloan
15
+ MambuPy.api.mambutransaction
14
16
  MambuPy.api.mambugroup
15
17
  MambuPy.api.mambuclient
16
18
  MambuPy.api.mambubranch
17
19
  MambuPy.api.mambucentre
18
20
  MambuPy.api.mambuuser
19
- MambuPy.api.mambuproduct
21
+ MambuPy.api.mambutask
22
+ MambuPy.api.mambucustomfield
20
23
 
21
24
  Entities use the Mixin pattern to acquire functionality.
22
25
  """
@@ -10,7 +10,6 @@ Currently supports REST.
10
10
  import base64
11
11
  import copy
12
12
  import json
13
- import logging
14
13
  import mimetypes
15
14
  import os
16
15
  import re
@@ -36,11 +35,11 @@ from MambuPy.mambuutil import (
36
35
  apipwd,
37
36
  apiurl,
38
37
  apiuser,
38
+ setup_logging,
39
39
  )
40
40
 
41
41
 
42
- logger = logging.getLogger(__name__)
43
- logger.propagate = True
42
+ logger = setup_logging(__name__)
44
43
 
45
44
 
46
45
  class MambuConnectorREST(MambuConnector, MambuConnectorReader, MambuConnectorWriter):
@@ -143,7 +142,7 @@ url %s, params %s, data %s, headers %s",
143
142
  method,
144
143
  params,
145
144
  data,
146
- [(k, v) for k, v in headers.items()],
145
+ [(k, v) for k, v in headers.items() if k != "Authorization"],
147
146
  )
148
147
  if hasattr(resp, "content"): # pragma: no cover
149
148
  logger.error("HTTPError, resp content: %s", resp.content)
@@ -183,7 +182,7 @@ url %s, params %s, data %s, headers %s",
183
182
  url,
184
183
  params,
185
184
  data,
186
- [(k, v) for k, v in headers.items()],
185
+ [(k, v) for k, v in headers.items() if k != "Authorization"],
187
186
  )
188
187
  raise MambuCommError(
189
188
  "COMM Error: I cannot communicate with Mambu: {}".format(rerr)
@@ -197,7 +196,7 @@ url %s, params %s, data %s, headers %s",
197
196
  url,
198
197
  params,
199
198
  data,
200
- [(k, v) for k, v in headers.items()],
199
+ [(k, v) for k, v in headers.items() if k != "Authorization"],
201
200
  )
202
201
  if hasattr(resp, "content"): # pragma: no cover
203
202
  logger.error("Exception, resp content: %s", resp.content)
@@ -8,7 +8,6 @@
8
8
  import copy
9
9
  from importlib import import_module
10
10
  import json
11
- import logging
12
11
  import time
13
12
 
14
13
  from .classes import GenericClass
@@ -22,11 +21,10 @@ from .interfaces import (
22
21
  from .connector.rest import MambuConnectorREST
23
22
  from .mambustruct import MambuStruct
24
23
  from .vos import MambuDocument, MambuComment, MambuValueObject
25
- from MambuPy.mambuutil import MambuError, MambuPyError
24
+ from MambuPy.mambuutil import MambuError, MambuPyError, setup_logging
26
25
 
27
26
 
28
- logger = logging.getLogger(__name__)
29
- logger.propagate = True
27
+ logger = setup_logging(__name__)
30
28
 
31
29
 
32
30
  class MambuEntity(MambuStruct):
@@ -116,7 +116,8 @@ class MambuStruct(MambuMapObj):
116
116
  if ent in self._attrs.keys():
117
117
  entity = self._attrs[ent]
118
118
  if entity.__class__.__name__ == self._cf_class.__name__:
119
- entity.get_mcf()
119
+ if not entity.mcf:
120
+ entity.get_mcf()
120
121
  return self.__getattribute_for_cf(ent, entity)
121
122
  return lambda **kwargs: entity
122
123
  return lambda **kwargs: self.getEntities([ent], **kwargs)[0]
@@ -31,6 +31,8 @@ RC files must have the following format:
31
31
  dbhost=Database_host
32
32
  dbport=Database_port
33
33
  dbeng=Database_engine
34
+ [MAMBUPY]
35
+ loggingconf=Logging_conf_path
34
36
 
35
37
  You can use environment variables to override the previous behaviour for any
36
38
  option. The variable must be named as follows::
@@ -88,6 +90,8 @@ default_configs = {
88
90
  "dbhost": "localhost",
89
91
  "dbport": "3306",
90
92
  "dbeng": "mysql",
93
+ # MambuPy configurations
94
+ "loggingconf": "", # empty string means default logging, path to a yaml for logging configuration
91
95
  }
92
96
  """ Defaults dictionary for the options configured here.
93
97
 
@@ -125,6 +129,7 @@ argparser.add_argument("--mambupy_dbpwd")
125
129
  argparser.add_argument("--mambupy_dbhost")
126
130
  argparser.add_argument("--mambupy_dbport")
127
131
  argparser.add_argument("--mambupy_dbeng")
132
+ argparser.add_argument("--mambupy_loggingconf")
128
133
  args, unknown = argparser.parse_known_args()
129
134
 
130
135
 
@@ -191,3 +196,5 @@ dbport = get_conf(config, "DB", "dbport")
191
196
  """Port to connect to the host of the Mambu's DB backup"""
192
197
  dbeng = get_conf(config, "DB", "dbeng")
193
198
  """DB engine for the Mambu's DB backup"""
199
+ loggingconf = get_conf(config, "MAMBUPY", "loggingconf")
200
+ """Directory where to store logs"""
@@ -21,8 +21,15 @@ Exceptions, some API return codes, utility functions, a lot of urlfuncs
21
21
 
22
22
  .. todo:: status API V2: testing of EVERYTHING is required """
23
23
 
24
+ import logging
25
+ import logging.config as logging_config
26
+ import os
27
+ from codecs import open as copen
28
+
29
+ import yaml
30
+
31
+ from .mambuconfig import apipagination, apipwd, apiurl, apiuser, loggingconf
24
32
  from .mambugeturl import getmambuurl
25
- from .mambuconfig import apipwd, apiurl, apiuser, apipagination
26
33
 
27
34
  try:
28
35
  # python2
@@ -33,7 +40,6 @@ except NameError:
33
40
 
34
41
  import json
35
42
  import sys
36
-
37
43
  from datetime import datetime, timezone
38
44
 
39
45
  API_RETURN_CODES = {
@@ -325,13 +331,8 @@ from time import sleep
325
331
  import requests
326
332
 
327
333
 
328
- def _backup_db_previous_prep(callback, kwargs):
334
+ def _backup_db_previous_prep(callback, logger, kwargs):
329
335
  list_ret = []
330
- try:
331
- verbose = kwargs["verbose"]
332
- except KeyError:
333
- verbose = False
334
- list_ret.append(verbose)
335
336
  try:
336
337
  retries = kwargs["retries"]
337
338
  except KeyError:
@@ -355,13 +356,7 @@ def _backup_db_previous_prep(callback, kwargs):
355
356
  }
356
357
  list_ret.append(headers)
357
358
 
358
- if verbose:
359
- log = open("/tmp/log_mambu_backup", "a")
360
- log.write(datetime.now().strftime("%Y-%m-%d %H:%M:%S") + " - Mambu DB Backup\n")
361
- log.flush()
362
- else:
363
- log = None
364
- list_ret.append(log)
359
+ logger.info("Mambu DB Backup")
365
360
 
366
361
  user = kwargs.pop("user", apiuser)
367
362
  list_ret.append(user)
@@ -375,14 +370,12 @@ def _backup_db_previous_prep(callback, kwargs):
375
370
  return list_ret
376
371
 
377
372
 
378
- def _backup_db_request(justbackup, data, user, pwd, verbose=None, log=None):
373
+ def _backup_db_request(justbackup, data, user, pwd, logger=None):
379
374
  try:
380
375
  if not justbackup:
381
376
  posturl = iri_to_uri(getmambuurl() + "database/backup")
382
- if verbose:
383
- log.write("open url: " + posturl + "\n")
384
- log.write("data: " + str(data) + "\n")
385
- log.flush()
377
+ logger.info("open url: " + posturl)
378
+ logger.info("data: " + str(data))
386
379
  resp = requests.post(
387
380
  posturl,
388
381
  data=json.dumps(data),
@@ -392,67 +385,35 @@ def _backup_db_request(justbackup, data, user, pwd, verbose=None, log=None):
392
385
  },
393
386
  auth=(user, pwd),
394
387
  )
395
- if verbose:
396
- log.write(
397
- datetime.now().strftime("%Y-%m-%d %H:%M:%S")
398
- + " - "
399
- + str(resp.content)
400
- + "\n"
401
- )
402
- log.write(
403
- datetime.now().strftime("%Y-%m-%d %H:%M:%S")
404
- + " - "
405
- + resp.request.url
406
- + "\n"
407
- )
408
- log.write(
409
- datetime.now().strftime("%Y-%m-%d %H:%M:%S")
410
- + " - "
411
- + resp.request.body
412
- + "\n"
413
- )
414
- log.write(
415
- datetime.now().strftime("%Y-%m-%d %H:%M:%S")
416
- + " - "
417
- + str(resp.request.headers)
418
- + "\n"
419
- )
420
- log.flush()
388
+ logger.info(str(resp.content))
389
+ logger.info(resp.request.url)
390
+ logger.info(resp.request.body)
391
+ logger.info(str([(k, v) for k, v in resp.request.headers.items() if k != "Authorization"]))
421
392
  except Exception as ex:
422
393
  mess = "Error requesting backup: %s" % repr(ex)
423
- if verbose:
424
- log.write(mess + "\n")
425
- log.close()
394
+ logger.exception(mess)
426
395
  raise MambuError(mess)
427
396
 
428
397
  if not justbackup and resp.status_code != 202:
429
398
  mess = "Error posting request for backup: %s" % resp.content
430
- if verbose:
431
- log.write(mess + "\n")
432
- log.close()
399
+ logger.error(mess)
433
400
  raise MambuCommError(mess)
434
401
 
435
402
 
436
403
  def _backup_db_timeout_mechanism(
437
- justbackup, retries, bool_func, force_download_latest, verbose=None, log=None
404
+ justbackup, retries, bool_func, force_download_latest, logger=None
438
405
  ):
439
406
  value_to_latest = True
440
407
  while not justbackup and retries and not bool_func():
441
- if verbose:
442
- log.write("waiting...\n")
443
- log.flush()
408
+ logger.info("waiting...")
444
409
  sleep(10)
445
410
  retries -= 1
446
411
  if retries < 0:
447
412
  retries = -1
448
413
  if not justbackup and not retries:
449
414
  mess = "Tired of waiting, giving up..."
450
- if verbose:
451
- log.write(mess + "\n")
452
- log.flush()
415
+ logger.warning(mess)
453
416
  if not force_download_latest:
454
- if verbose:
455
- log.close()
456
417
  raise MambuError(mess)
457
418
  else:
458
419
  value_to_latest = False
@@ -461,27 +422,21 @@ def _backup_db_timeout_mechanism(
461
422
  return value_to_latest
462
423
 
463
424
 
464
- def _backup_db_request_download_backup(user, pwd, headers, verbose=None, log=None):
425
+ def _backup_db_request_download_backup(user, pwd, headers, logger=None):
465
426
  geturl = iri_to_uri(getmambuurl() + "database/backup/LATEST")
466
- if verbose:
467
- log.write("open url: " + geturl + "\n")
468
- log.flush()
427
+ logger.info("open url: " + geturl)
469
428
  resp = requests.get(geturl, auth=(user, pwd), headers=headers)
470
429
 
471
430
  if resp.status_code != 200:
472
431
  mess = "Error getting database backup: %s" % resp.content
473
- if verbose:
474
- log.write(mess + "\n")
475
- log.close()
432
+ logger.error(mess)
476
433
  raise MambuCommError(mess)
477
434
 
478
435
  return resp
479
436
 
480
437
 
481
- def _backup_db_post_processing(resp, output_fname, verbose=None, log=None):
482
- if verbose:
483
- log.write("saving...\n")
484
- log.flush()
438
+ def _backup_db_post_processing(resp, output_fname, logger=None):
439
+ logger.info("saving...")
485
440
  with open(output_fname, "wb") as fw:
486
441
  fw.write(resp.content)
487
442
 
@@ -516,8 +471,6 @@ def backup_db(callback, bool_func, output_fname, *args, **kwargs):
516
471
  * user, pwd and url allow you to change the Mambu permissions for
517
472
  the getmambuurl internally called here.
518
473
 
519
- * verbose is a boolean flag for verbosity.
520
-
521
474
  * retries number of retries for bool_func or -1 for keep waiting.
522
475
 
523
476
  * just_backup bool if True, skip asking for backup, just download LATEST
@@ -531,37 +484,54 @@ def backup_db(callback, bool_func, output_fname, *args, **kwargs):
531
484
 
532
485
  .. todo:: status API V2: compatible
533
486
  """
534
-
487
+ logger = setup_logging("mambupy.backup_db")
535
488
  # previous preparation
536
489
  (
537
- verbose,
538
490
  retries,
539
491
  justbackup,
540
492
  force_download_latest,
541
493
  headers,
542
- log,
543
494
  user,
544
495
  pwd,
545
496
  data,
546
- ) = _backup_db_previous_prep(callback, kwargs)
497
+ ) = _backup_db_previous_prep(callback, logger, kwargs)
547
498
 
548
499
  # POST to request Mambu to prepare backup of its own DB
549
- _backup_db_request(justbackup, data, user, pwd, verbose, log)
500
+ _backup_db_request(justbackup, data, user, pwd, logger)
550
501
 
551
502
  # wait & timeout mechanism
552
503
  data["latest"] = _backup_db_timeout_mechanism(
553
- justbackup, retries, bool_func, force_download_latest, verbose, log
504
+ justbackup, retries, bool_func, force_download_latest, logger
554
505
  )
555
506
 
556
507
  # GET request to download LATEST Mambu's DB backup
557
- resp = _backup_db_request_download_backup(user, pwd, headers, verbose, log)
508
+ resp = _backup_db_request_download_backup(user, pwd, headers, logger)
558
509
 
559
510
  # post-processing
560
- _backup_db_post_processing(resp, output_fname, verbose, log)
511
+ _backup_db_post_processing(resp, output_fname, logger)
561
512
 
562
513
  # no refactor
563
- if verbose:
564
- log.write("DONE!\n")
565
- log.close()
514
+ logger.info("DONE!")
566
515
 
567
516
  return data
517
+
518
+
519
+ def setup_logging(
520
+ loggername,
521
+ default_level=logging.INFO,
522
+ ) -> logging.Logger:
523
+ """ Get a logger configured with a yaml file. """
524
+ if os.path.exists(loggingconf):
525
+ with copen(loggingconf, "r", "utf-8") as f:
526
+ config = yaml.full_load(f.read())
527
+ logging_config.dictConfig(config)
528
+ loggr = logging.getLogger(loggername)
529
+ else:
530
+ loggr = logging.getLogger(loggername)
531
+ loggr.setLevel(default_level)
532
+ loggr.propagate = True
533
+ return loggr
534
+
535
+
536
+ logger = setup_logging("mambupy")
537
+ """Default logger for mambupy module"""
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: MambuPy
3
- Version: 2.0.0b48
3
+ Version: 2.0.0b50
4
4
  Summary: A python lib for using Mambu APIs.
5
5
  Home-page: https://mambupydocs.readthedocs.io
6
6
  Author: Javier Novoa C.
7
7
  Author-email: jstitch@gmail.com
8
8
  License: GPLv3
9
9
  Keywords: mambu
10
- Requires-Python: >=2.7
10
+ Requires-Python: >=3.8
11
11
  Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
13
 
@@ -1,4 +1,5 @@
1
- future
1
+ PyYAML==6.0.1
2
+ future==0.18.3
2
3
  requests==2.31.0
3
4
  requests_toolbelt==1.0.0
4
5
  dateutils==0.6.12
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: MambuPy
3
- Version: 2.0.0b48
3
+ Version: 2.0.0b50
4
4
  Summary: A python lib for using Mambu APIs.
5
5
  Home-page: https://mambupydocs.readthedocs.io
6
6
  Author: Javier Novoa C.
7
7
  Author-email: jstitch@gmail.com
8
8
  License: GPLv3
9
9
  Keywords: mambu
10
- Requires-Python: >=2.7
10
+ Requires-Python: >=3.8
11
11
  Description-Content-Type: text/markdown
12
12
  License-File: LICENSE
13
13
 
@@ -9,7 +9,6 @@
9
9
  MambuPy.orm
10
10
  MambuPy.api
11
11
  MambuPy.api.connector
12
- MambuPy.rest1to2
13
12
 
14
13
 
15
14
  Currently, there are two different ways to access Mambu objects:
@@ -35,5 +34,5 @@ TODOS
35
34
  to achive TDD when implementing features or correcting bugs.
36
35
  """
37
36
 
38
- __version__ = "2.0.0b48"
37
+ __version__ = "2.0.0b50"
39
38
  """The version of this module."""
@@ -10,13 +10,16 @@ Objects using `Mambu REST API <https://api.mambu.com/?python>`_
10
10
  MambuPy.api.interfaces
11
11
  MambuPy.api.vos
12
12
  MambuPy.api.mambustruct
13
+ MambuPy.api.mambuproduct
13
14
  MambuPy.api.mambuloan
15
+ MambuPy.api.mambutransaction
14
16
  MambuPy.api.mambugroup
15
17
  MambuPy.api.mambuclient
16
18
  MambuPy.api.mambubranch
17
19
  MambuPy.api.mambucentre
18
20
  MambuPy.api.mambuuser
19
- MambuPy.api.mambuproduct
21
+ MambuPy.api.mambutask
22
+ MambuPy.api.mambucustomfield
20
23
 
21
24
  Entities use the Mixin pattern to acquire functionality.
22
25
  """
@@ -10,7 +10,6 @@ Currently supports REST.
10
10
  import base64
11
11
  import copy
12
12
  import json
13
- import logging
14
13
  import mimetypes
15
14
  import os
16
15
  import re
@@ -36,11 +35,11 @@ from MambuPy.mambuutil import (
36
35
  apipwd,
37
36
  apiurl,
38
37
  apiuser,
38
+ setup_logging,
39
39
  )
40
40
 
41
41
 
42
- logger = logging.getLogger(__name__)
43
- logger.propagate = True
42
+ logger = setup_logging(__name__)
44
43
 
45
44
 
46
45
  class MambuConnectorREST(MambuConnector, MambuConnectorReader, MambuConnectorWriter):
@@ -143,7 +142,7 @@ url %s, params %s, data %s, headers %s",
143
142
  method,
144
143
  params,
145
144
  data,
146
- [(k, v) for k, v in headers.items()],
145
+ [(k, v) for k, v in headers.items() if k != "Authorization"],
147
146
  )
148
147
  if hasattr(resp, "content"): # pragma: no cover
149
148
  logger.error("HTTPError, resp content: %s", resp.content)
@@ -183,7 +182,7 @@ url %s, params %s, data %s, headers %s",
183
182
  url,
184
183
  params,
185
184
  data,
186
- [(k, v) for k, v in headers.items()],
185
+ [(k, v) for k, v in headers.items() if k != "Authorization"],
187
186
  )
188
187
  raise MambuCommError(
189
188
  "COMM Error: I cannot communicate with Mambu: {}".format(rerr)
@@ -197,7 +196,7 @@ url %s, params %s, data %s, headers %s",
197
196
  url,
198
197
  params,
199
198
  data,
200
- [(k, v) for k, v in headers.items()],
199
+ [(k, v) for k, v in headers.items() if k != "Authorization"],
201
200
  )
202
201
  if hasattr(resp, "content"): # pragma: no cover
203
202
  logger.error("Exception, resp content: %s", resp.content)
@@ -8,7 +8,6 @@
8
8
  import copy
9
9
  from importlib import import_module
10
10
  import json
11
- import logging
12
11
  import time
13
12
 
14
13
  from .classes import GenericClass
@@ -22,11 +21,10 @@ from .interfaces import (
22
21
  from .connector.rest import MambuConnectorREST
23
22
  from .mambustruct import MambuStruct
24
23
  from .vos import MambuDocument, MambuComment, MambuValueObject
25
- from MambuPy.mambuutil import MambuError, MambuPyError
24
+ from MambuPy.mambuutil import MambuError, MambuPyError, setup_logging
26
25
 
27
26
 
28
- logger = logging.getLogger(__name__)
29
- logger.propagate = True
27
+ logger = setup_logging(__name__)
30
28
 
31
29
 
32
30
  class MambuEntity(MambuStruct):
@@ -116,7 +116,8 @@ class MambuStruct(MambuMapObj):
116
116
  if ent in self._attrs.keys():
117
117
  entity = self._attrs[ent]
118
118
  if entity.__class__.__name__ == self._cf_class.__name__:
119
- entity.get_mcf()
119
+ if not entity.mcf:
120
+ entity.get_mcf()
120
121
  return self.__getattribute_for_cf(ent, entity)
121
122
  return lambda **kwargs: entity
122
123
  return lambda **kwargs: self.getEntities([ent], **kwargs)[0]
@@ -31,6 +31,8 @@ RC files must have the following format:
31
31
  dbhost=Database_host
32
32
  dbport=Database_port
33
33
  dbeng=Database_engine
34
+ [MAMBUPY]
35
+ loggingconf=Logging_conf_path
34
36
 
35
37
  You can use environment variables to override the previous behaviour for any
36
38
  option. The variable must be named as follows::
@@ -88,6 +90,8 @@ default_configs = {
88
90
  "dbhost": "localhost",
89
91
  "dbport": "3306",
90
92
  "dbeng": "mysql",
93
+ # MambuPy configurations
94
+ "loggingconf": "", # empty string means default logging, path to a yaml for logging configuration
91
95
  }
92
96
  """ Defaults dictionary for the options configured here.
93
97
 
@@ -125,6 +129,7 @@ argparser.add_argument("--mambupy_dbpwd")
125
129
  argparser.add_argument("--mambupy_dbhost")
126
130
  argparser.add_argument("--mambupy_dbport")
127
131
  argparser.add_argument("--mambupy_dbeng")
132
+ argparser.add_argument("--mambupy_loggingconf")
128
133
  args, unknown = argparser.parse_known_args()
129
134
 
130
135
 
@@ -191,3 +196,5 @@ dbport = get_conf(config, "DB", "dbport")
191
196
  """Port to connect to the host of the Mambu's DB backup"""
192
197
  dbeng = get_conf(config, "DB", "dbeng")
193
198
  """DB engine for the Mambu's DB backup"""
199
+ loggingconf = get_conf(config, "MAMBUPY", "loggingconf")
200
+ """Directory where to store logs"""