MambuPy 2.0.0b47__tar.gz → 2.0.0b49__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.
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/__init__.py +1 -2
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/__init__.py +4 -1
- {MambuPy-2.0.0b47/mambupy → MambuPy-2.0.0b49/MambuPy}/api/connector/rest.py +5 -6
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/entities.py +2 -4
- {MambuPy-2.0.0b47/mambupy → MambuPy-2.0.0b49/MambuPy}/api/mambustruct.py +2 -1
- {MambuPy-2.0.0b47/mambupy → MambuPy-2.0.0b49/MambuPy}/mambuconfig.py +7 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/mambuutil.py +55 -85
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy.egg-info/PKG-INFO +2 -2
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy.egg-info/requires.txt +2 -1
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/PKG-INFO +2 -2
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/__init__.py +1 -2
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/__init__.py +4 -1
- {MambuPy-2.0.0b47/MambuPy → MambuPy-2.0.0b49/mambupy}/api/connector/rest.py +5 -6
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/entities.py +2 -4
- {MambuPy-2.0.0b47/MambuPy → MambuPy-2.0.0b49/mambupy}/api/mambustruct.py +2 -1
- {MambuPy-2.0.0b47/MambuPy → MambuPy-2.0.0b49/mambupy}/mambuconfig.py +7 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/mambuutil.py +55 -85
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/setup.py +3 -2
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/LICENSE +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/classes.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/connector/__init__.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/connector/mambuconnector.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/interfaces.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/mambubranch.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/mambucentre.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/mambuclient.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/mambucustomfield.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/mambugroup.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/mambuloan.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/mambuproduct.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/mamburole.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/mambutask.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/mambutransaction.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/mambuuser.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/api/vos.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/mambugeturl.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/__init__.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_activities.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_addresses.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_branches.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_centres.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_clients.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_customfields.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_dummies.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_groups.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_loans.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_mambu.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_orm.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_tasks.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/orm/schema_users.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/__init__.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/mambubranch.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/mambucentre.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/mambuclient.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/mambugroup.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/mambuloan.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/mambuproduct.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/mamburepayment.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/mambustruct.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/mambutask.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/mambutransaction.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/rest1to2/mambuuser.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/utils/__init__.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/utils/logging_config.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy/utils/userdeactivate.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy.egg-info/SOURCES.txt +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy.egg-info/dependency_links.txt +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/MambuPy.egg-info/top_level.txt +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/README.md +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/classes.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/connector/__init__.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/connector/mambuconnector.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/interfaces.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/mambubranch.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/mambucentre.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/mambuclient.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/mambucustomfield.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/mambugroup.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/mambuloan.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/mambuproduct.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/mamburole.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/mambutask.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/mambutransaction.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/mambuuser.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/api/vos.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/mambugeturl.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/__init__.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_activities.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_addresses.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_branches.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_centres.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_clients.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_customfields.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_dummies.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_groups.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_loans.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_mambu.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_orm.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_tasks.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/orm/schema_users.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/__init__.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/mambubranch.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/mambucentre.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/mambuclient.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/mambugroup.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/mambuloan.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/mambuproduct.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/mamburepayment.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/mambustruct.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/mambutask.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/mambutransaction.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/rest1to2/mambuuser.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/utils/__init__.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/utils/logging_config.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/mambupy/utils/userdeactivate.py +0 -0
- {MambuPy-2.0.0b47 → MambuPy-2.0.0b49}/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.
|
|
37
|
+
__version__ = "2.0.0b49"
|
|
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.
|
|
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 =
|
|
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 =
|
|
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.
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
383
|
-
|
|
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
|
-
|
|
396
|
-
|
|
397
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
425
|
+
def _backup_db_request_download_backup(user, pwd, headers, logger=None):
|
|
465
426
|
geturl = iri_to_uri(getmambuurl() + "database/backup/LATEST")
|
|
466
|
-
|
|
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
|
-
|
|
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,
|
|
482
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
511
|
+
_backup_db_post_processing(resp, output_fname, logger)
|
|
561
512
|
|
|
562
513
|
# no refactor
|
|
563
|
-
|
|
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.
|
|
3
|
+
Version: 2.0.0b49
|
|
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: >=
|
|
10
|
+
Requires-Python: >=3.8
|
|
11
11
|
Description-Content-Type: text/markdown
|
|
12
12
|
License-File: LICENSE
|
|
13
13
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: MambuPy
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0b49
|
|
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: >=
|
|
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.
|
|
37
|
+
__version__ = "2.0.0b49"
|
|
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.
|
|
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 =
|
|
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 =
|
|
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.
|
|
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"""
|