From 1da0ba39cc95b35666a37d56ae3aed9bad8ebbe4 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Sat, 11 Sep 2021 12:42:29 +0200 Subject: [PATCH] cmis: ignore cmislib logs (#56881) --- passerelle/apps/cmis/models.py | 32 ++++++++++++++++++-------------- passerelle/apps/cmis/views.py | 9 +++++---- passerelle/utils/logging.py | 34 ++++++++++++++++++++++++++++++++++ tests/test_cmis.py | 5 ++++- 4 files changed, 61 insertions(+), 19 deletions(-) create mode 100644 passerelle/utils/logging.py diff --git a/passerelle/apps/cmis/models.py b/passerelle/apps/cmis/models.py index 86dd4ca5..9307e29f 100644 --- a/passerelle/apps/cmis/models.py +++ b/passerelle/apps/cmis/models.py @@ -18,6 +18,7 @@ import base64 import binascii import functools import re +from contextlib import contextmanager import httplib2 from cmislib import CmisClient @@ -37,6 +38,7 @@ from django.utils.translation import ugettext_lazy as _ from passerelle.base.models import BaseResource from passerelle.utils.api import endpoint from passerelle.utils.jsonresponse import APIError +from passerelle.utils.logging import ignore_loggers SPECIAL_CHARS = '!#$%&+-^_`~;[]{}+=~' FILE_PATH_PATTERN = r'^(/|(/[\w%s]+)+)$' % re.escape(SPECIAL_CHARS) @@ -105,8 +107,8 @@ class CmisConnector(BaseResource): verbose_name = _('CMIS connector') def check_status(self): - cmis_gateway = self.get_cmis_gateway() - cmis_gateway.repo + with self.get_cmis_gateway() as cmis_gateway: + cmis_gateway.repo @endpoint( description=_('File upload'), @@ -126,19 +128,21 @@ class CmisConnector(BaseResource): raise APIError(error_msg, http_status=400) filename = data.get('filename') or data['file']['filename'] self.logger.info("received file_name: '%s', file_path: '%s'", filename, data["path"]) - cmis_gateway = self.get_cmis_gateway() - doc = cmis_gateway.create_doc( - filename, - data['path'], - data['file_byte_content'], - content_type=data['file'].get('content_type'), - object_type=data.get('object_type'), - properties=data.get('properties'), - ) - return {'data': {'properties': doc.properties}} - + with self.get_cmis_gateway() as cmis_gateway: + doc = cmis_gateway.create_doc( + filename, + data['path'], + data['file_byte_content'], + content_type=data['file'].get('content_type'), + object_type=data.get('object_type'), + properties=data.get('properties'), + ) + return {'data': {'properties': doc.properties}} + + @contextmanager def get_cmis_gateway(self): - return CMISGateway(self.cmis_endpoint, self.username, self.password, self.logger) + with ignore_loggers('cmislib'): + yield CMISGateway(self.cmis_endpoint, self.username, self.password, self.logger) def _validate_inputs(self, data): """process dict diff --git a/passerelle/apps/cmis/views.py b/passerelle/apps/cmis/views.py index 5e60b1ed..ad9447cb 100644 --- a/passerelle/apps/cmis/views.py +++ b/passerelle/apps/cmis/views.py @@ -14,7 +14,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from cmislib import CmisClient from cmislib.exceptions import ObjectNotFoundException from django.http import Http404 from django.utils.translation import ugettext_lazy as _ @@ -27,10 +26,13 @@ class CmisTypeView(TemplateView): model = CmisConnector template_name = 'cmis/cmis_type.html' - def get(self, request, *args, **kwargs): + def dispatch(self, request, *args, **kwargs): self.connector = CmisConnector.objects.get(slug=kwargs['connector_slug']) - self.cmis_gateway = self.connector.get_cmis_gateway() + with self.connector.get_cmis_gateway() as cmis_gateway: + self.cmis_gateway = cmis_gateway + return super().dispatch(request, *args, **kwargs) + def get(self, request, *args, **kwargs): type_id = request.GET.get('id') if type_id: try: @@ -39,7 +41,6 @@ class CmisTypeView(TemplateView): raise Http404(_('Cmis type not found.')) else: self.current_type = None - return super(CmisTypeView, self).get(request, *args, **kwargs) def get_context_data(self, **kwargs): diff --git a/passerelle/utils/logging.py b/passerelle/utils/logging.py new file mode 100644 index 00000000..55efb7c1 --- /dev/null +++ b/passerelle/utils/logging.py @@ -0,0 +1,34 @@ +# passerelle - uniform access to multiple data sources and services +# Copyright (C) 2021 Entr'ouvert +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +import logging +from contextlib import contextmanager + + +@contextmanager +def ignore_loggers(*loggers_names): + propagate = {} + + for logger_name in loggers_names: + logger = logging.getLogger(logger_name) + propagate[logger] = logger.propagate + logger.propagate = False + + yield + + for logger_name in loggers_names: + logger = logging.getLogger(logger_name) + logger.propagate = propagate[logger] diff --git a/tests/test_cmis.py b/tests/test_cmis.py index e87b84fc..928ce99a 100644 --- a/tests/test_cmis.py +++ b/tests/test_cmis.py @@ -510,11 +510,12 @@ def test_cmis_types_view(setup, app, admin_user, monkeypatch): @pytest.mark.parametrize('debug', (False, True)) @mock.patch('httplib2.Http.request') -def test_raw_uploadfile(mocked_request, app, setup, debug): +def test_raw_uploadfile(mocked_request, app, setup, debug, caplog): """ Simulate the bellow bash query : $ http https://passerelle.dev.publik.love/cmis/ged/uploadfile \ file:='{"filename": "test2", "content": "c2FsdXQK"}' path=/test-eo """ + caplog.set_level('DEBUG') file_name = "test2" file_content = 'salut\n' path = "/test-eo" @@ -587,6 +588,8 @@ def test_raw_uploadfile(mocked_request, app, setup, debug): assert logs[9].message == 'cmislib POST response (200)' assert logs[9].extra['response'].startswith('