Projet

Général

Profil

0001-cmis-ignore-cmislib-logs-56881.patch

Benjamin Dauvergne, 11 septembre 2021 12:42

Télécharger (6,96 ko)

Voir les différences:

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
passerelle/apps/cmis/models.py
18 18
import binascii
19 19
import functools
20 20
import re
21
from contextlib import contextmanager
21 22

  
22 23
import httplib2
23 24
from cmislib import CmisClient
......
37 38
from passerelle.base.models import BaseResource
38 39
from passerelle.utils.api import endpoint
39 40
from passerelle.utils.jsonresponse import APIError
41
from passerelle.utils.logging import ignore_loggers
40 42

  
41 43
SPECIAL_CHARS = '!#$%&+-^_`~;[]{}+=~'
42 44
FILE_PATH_PATTERN = r'^(/|(/[\w%s]+)+)$' % re.escape(SPECIAL_CHARS)
......
105 107
        verbose_name = _('CMIS connector')
106 108

  
107 109
    def check_status(self):
108
        cmis_gateway = self.get_cmis_gateway()
109
        cmis_gateway.repo
110
        with self.get_cmis_gateway() as cmis_gateway:
111
            cmis_gateway.repo
110 112

  
111 113
    @endpoint(
112 114
        description=_('File upload'),
......
126 128
            raise APIError(error_msg, http_status=400)
127 129
        filename = data.get('filename') or data['file']['filename']
128 130
        self.logger.info("received file_name: '%s', file_path: '%s'", filename, data["path"])
129
        cmis_gateway = self.get_cmis_gateway()
130
        doc = cmis_gateway.create_doc(
131
            filename,
132
            data['path'],
133
            data['file_byte_content'],
134
            content_type=data['file'].get('content_type'),
135
            object_type=data.get('object_type'),
136
            properties=data.get('properties'),
137
        )
138
        return {'data': {'properties': doc.properties}}
139

  
131
        with self.get_cmis_gateway() as cmis_gateway:
132
            doc = cmis_gateway.create_doc(
133
                filename,
134
                data['path'],
135
                data['file_byte_content'],
136
                content_type=data['file'].get('content_type'),
137
                object_type=data.get('object_type'),
138
                properties=data.get('properties'),
139
            )
140
            return {'data': {'properties': doc.properties}}
141

  
142
    @contextmanager
140 143
    def get_cmis_gateway(self):
141
        return CMISGateway(self.cmis_endpoint, self.username, self.password, self.logger)
144
        with ignore_loggers('cmislib'):
145
            yield CMISGateway(self.cmis_endpoint, self.username, self.password, self.logger)
142 146

  
143 147
    def _validate_inputs(self, data):
144 148
        """process dict
passerelle/apps/cmis/views.py
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17
from cmislib import CmisClient
18 17
from cmislib.exceptions import ObjectNotFoundException
19 18
from django.http import Http404
20 19
from django.utils.translation import ugettext_lazy as _
......
27 26
    model = CmisConnector
28 27
    template_name = 'cmis/cmis_type.html'
29 28

  
30
    def get(self, request, *args, **kwargs):
29
    def dispatch(self, request, *args, **kwargs):
31 30
        self.connector = CmisConnector.objects.get(slug=kwargs['connector_slug'])
32
        self.cmis_gateway = self.connector.get_cmis_gateway()
31
        with self.connector.get_cmis_gateway() as cmis_gateway:
32
            self.cmis_gateway = cmis_gateway
33
            return super().dispatch(request, *args, **kwargs)
33 34

  
35
    def get(self, request, *args, **kwargs):
34 36
        type_id = request.GET.get('id')
35 37
        if type_id:
36 38
            try:
......
39 41
                raise Http404(_('Cmis type not found.'))
40 42
        else:
41 43
            self.current_type = None
42

  
43 44
        return super(CmisTypeView, self).get(request, *args, **kwargs)
44 45

  
45 46
    def get_context_data(self, **kwargs):
passerelle/utils/logging.py
1
# passerelle - uniform access to multiple data sources and services
2
# Copyright (C) 2021 Entr'ouvert
3
#
4
# This program is free software: you can redistribute it and/or modify it
5
# under the terms of the GNU Affero General Public License as published
6
# by the Free Software Foundation, either version 3 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU Affero General Public License for more details.
13
#
14
# You should have received a copy of the GNU Affero General Public License
15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16

  
17
import logging
18
from contextlib import contextmanager
19

  
20

  
21
@contextmanager
22
def ignore_loggers(*loggers_names):
23
    propagate = {}
24

  
25
    for logger_name in loggers_names:
26
        logger = logging.getLogger(logger_name)
27
        propagate[logger] = logger.propagate
28
        logger.propagate = False
29

  
30
    yield
31

  
32
    for logger_name in loggers_names:
33
        logger = logging.getLogger(logger_name)
34
        logger.propagate = propagate[logger]
tests/test_cmis.py
510 510

  
511 511
@pytest.mark.parametrize('debug', (False, True))
512 512
@mock.patch('httplib2.Http.request')
513
def test_raw_uploadfile(mocked_request, app, setup, debug):
513
def test_raw_uploadfile(mocked_request, app, setup, debug, caplog):
514 514
    """ Simulate the bellow bash query :
515 515
    $ http https://passerelle.dev.publik.love/cmis/ged/uploadfile \
516 516
           file:='{"filename": "test2", "content": "c2FsdXQK"}' path=/test-eo
517 517
    """
518
    caplog.set_level('DEBUG')
518 519
    file_name = "test2"
519 520
    file_content = 'salut\n'
520 521
    path = "/test-eo"
......
587 588
        assert logs[9].message == 'cmislib POST response (200)'
588 589
        assert logs[9].extra['response'].startswith('<?xml')
589 590

  
591
    assert not any('cmislib' in record.name for record in caplog.records)
592

  
590 593

  
591 594
def test_cmis_check_status(app, setup, monkeypatch):
592 595
    cmis_gateway = Mock()
593
-