Skip to content

Commit

Permalink
(BSR)[API] bump: Replaced sib-api-v3-sdk (not maintained anymore) by …
Browse files Browse the repository at this point in the history
…brevo-python
  • Loading branch information
pcharlet-pass committed Jan 27, 2025
1 parent 06b3002 commit 1be26e6
Show file tree
Hide file tree
Showing 17 changed files with 136 additions and 95 deletions.
83 changes: 63 additions & 20 deletions api/poetry.lock

Large diffs are not rendered by default.

4 changes: 1 addition & 3 deletions api/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ dependencies = [
"beautifulsoup4==4.12.3",
"boto3==1.36.6",
"boussole==2.1.3",
"brevo-python==1.1.2",
"click-option-group==0.5.6",
"click==8.1.8",
"clickhouse-sqlalchemy==0.2.7",
Expand Down Expand Up @@ -67,7 +68,6 @@ dependencies = [
"schwifty==2025.1.0",
"semver==3.0.4",
"sentry-sdk[flask]==2.20.0",
"sib-api-v3-sdk>=7.6.0",
"slack-sdk==3.34.0",
"spectree==1.2.1",
# Do not use 1.4.46 that has a new
Expand Down Expand Up @@ -256,8 +256,6 @@ filterwarnings = [
# is in a release, we'll be able to bump weasyprint and remove these 2 filters.
"ignore:transform is deprecated, use set_matrix instead.:DeprecationWarning",
"ignore:text_matrix is deprecated, use set_text_matrix instead.:DeprecationWarning",
# FIXME (prouzet, 2024-11-29): sib-api-v3-sdk latest version is still 7.6.0 (March 2023)
"ignore:HTTPResponse.getheaders\\(\\) is deprecated and will be removed in urllib3 v2.1.0. Instead access HTTPResponse.headers directly.:DeprecationWarning",
]
testpaths = ["tests"]
norecursedirs = [".git", "venv", ".pytest_cache"]
Expand Down
24 changes: 12 additions & 12 deletions api/src/pcapi/core/external/sendinblue.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
from typing import Iterable
import urllib.parse

import sib_api_v3_sdk
from sib_api_v3_sdk.api.contacts_api import ContactsApi
from sib_api_v3_sdk.models.created_process_id import CreatedProcessId
from sib_api_v3_sdk.rest import ApiException as SendinblueApiException
import brevo_python
from brevo_python.api.contacts_api import ContactsApi
from brevo_python.models.created_process_id import CreatedProcessId
from brevo_python.rest import ApiException as SendinblueApiException

from pcapi import settings
from pcapi.core import mails as mails_api
Expand Down Expand Up @@ -304,7 +304,7 @@ def make_update_request(payload: UpdateSendinblueContactRequest) -> None:
def send_import_contacts_request(
api_instance: ContactsApi, file_body: str, list_ids: list[int] | None, email_blacklist: bool = False
) -> None:
request_contact_import = sib_api_v3_sdk.RequestContactImport(
request_contact_import = brevo_python.RequestContactImport(
email_blacklist=email_blacklist,
sms_blacklist=False,
update_existing_contacts=True,
Expand Down Expand Up @@ -361,9 +361,9 @@ def import_contacts_in_sendinblue(

# send pro users request
if pro_users:
configuration = sib_api_v3_sdk.Configuration()
configuration = brevo_python.Configuration()
configuration.api_key["api-key"] = settings.SENDINBLUE_PRO_API_KEY
api_instance = sib_api_v3_sdk.ContactsApi(sib_api_v3_sdk.ApiClient(configuration))
api_instance = brevo_python.ContactsApi(brevo_python.ApiClient(configuration))

pro_users_file_body = build_file_body(pro_users)
send_import_contacts_request(
Expand All @@ -374,9 +374,9 @@ def import_contacts_in_sendinblue(
)
# send young users request
if young_users:
configuration = sib_api_v3_sdk.Configuration()
configuration = brevo_python.Configuration()
configuration.api_key["api-key"] = settings.SENDINBLUE_API_KEY
api_instance = sib_api_v3_sdk.ContactsApi(sib_api_v3_sdk.ApiClient(configuration))
api_instance = brevo_python.ContactsApi(brevo_python.ApiClient(configuration))

young_users_file_body = build_file_body(young_users)
send_import_contacts_request(
Expand All @@ -390,7 +390,7 @@ def import_contacts_in_sendinblue(
def _send_import_request(
api_instance: ContactsApi, sib_list_id: int, iteration: int, count: int, file_body: str
) -> int:
request_contact_import = sib_api_v3_sdk.RequestContactImport()
request_contact_import = brevo_python.RequestContactImport()
request_contact_import.file_body = file_body
request_contact_import.list_ids = [sib_list_id]
request_contact_import.notify_url = urllib.parse.urljoin(
Expand Down Expand Up @@ -429,12 +429,12 @@ def add_contacts_to_list(user_emails: Iterable[str], sib_list_id: int, use_pro_s
bool: True when successful, False otherwise
"""

configuration = sib_api_v3_sdk.Configuration()
configuration = brevo_python.Configuration()
if use_pro_subaccount:
configuration.api_key["api-key"] = settings.SENDINBLUE_PRO_API_KEY
else:
configuration.api_key["api-key"] = settings.SENDINBLUE_API_KEY
contacts_api_instance: ContactsApi = sib_api_v3_sdk.ContactsApi(sib_api_v3_sdk.ApiClient(configuration))
contacts_api_instance: ContactsApi = brevo_python.ContactsApi(brevo_python.ApiClient(configuration))

iteration = 1

Expand Down
10 changes: 5 additions & 5 deletions api/src/pcapi/core/mails/backends/sendinblue.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import logging
from typing import Iterable

import sib_api_v3_sdk
from sib_api_v3_sdk.rest import ApiException as SendinblueApiException
import brevo_python
from brevo_python.rest import ApiException as SendinblueApiException

from pcapi import settings
from pcapi.core.users.repository import find_user_by_email
Expand All @@ -25,12 +25,12 @@
class SendinblueBackend(BaseBackend):
def __init__(self, use_pro_subaccount: bool) -> None:
super().__init__()
configuration = sib_api_v3_sdk.Configuration()
configuration = brevo_python.Configuration()
if use_pro_subaccount:
configuration.api_key["api-key"] = settings.SENDINBLUE_PRO_API_KEY
else:
configuration.api_key["api-key"] = settings.SENDINBLUE_API_KEY
self.contacts_api = sib_api_v3_sdk.ContactsApi(sib_api_v3_sdk.ApiClient(configuration))
self.contacts_api = brevo_python.ContactsApi(brevo_python.ApiClient(configuration))

def send_mail(
self,
Expand Down Expand Up @@ -81,7 +81,7 @@ def create_contact(self, payload: serializers.UpdateSendinblueContactRequest) ->
Creates or updates a contact in Brevo (previously Sendinblue).
"""

contact = sib_api_v3_sdk.CreateContact(
contact = brevo_python.CreateContact(
email=payload.email,
attributes=payload.attributes,
list_ids=payload.contact_list_ids,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import json
import logging

import sib_api_v3_sdk
from sib_api_v3_sdk.rest import ApiException
import brevo_python
from brevo_python.rest import ApiException

from pcapi import settings
from pcapi.tasks.serialization.sendinblue_tasks import SendTransactionalEmailRequest
Expand Down Expand Up @@ -32,7 +32,7 @@ def send_transactional_email(payload: SendTransactionalEmailRequest) -> None:
"reply_to": payload.reply_to,
}

send_smtp_email = sib_api_v3_sdk.SendSmtpEmail(to=to, bcc=bcc, sender=sender, reply_to=reply_to, headers=headers)
send_smtp_email = brevo_python.SendSmtpEmail(to=to, bcc=bcc, sender=sender, reply_to=reply_to, headers=headers)

# Can send email with: to, sender, template_id, tags, params

Expand All @@ -57,12 +57,12 @@ def send_transactional_email(payload: SendTransactionalEmailRequest) -> None:
return

try:
configuration = sib_api_v3_sdk.Configuration()
configuration = brevo_python.Configuration()
if payload.use_pro_subaccount:
configuration.api_key["api-key"] = settings.SENDINBLUE_PRO_API_KEY
else:
configuration.api_key["api-key"] = settings.SENDINBLUE_API_KEY
api_instance = sib_api_v3_sdk.TransactionalEmailsApi(sib_api_v3_sdk.ApiClient(configuration))
api_instance = brevo_python.TransactionalEmailsApi(brevo_python.ApiClient(configuration))
api_instance.send_transac_email(send_smtp_email)

except ApiException as exception:
Expand Down
10 changes: 5 additions & 5 deletions api/src/pcapi/core/monkeypatches.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import typing

import sib_api_v3_sdk.rest
import brevo_python.rest

# Re-use the same logger since we log the exact same message.
from pcapi.utils.requests import logger
Expand All @@ -10,11 +10,11 @@


def custom_restclient_request(
self: sib_api_v3_sdk.rest.RESTClientObject,
self: brevo_python.rest.RESTClientObject,
method: str,
url: str,
**kwargs: typing.Any,
) -> sib_api_v3_sdk.rest.RESTResponse:
) -> brevo_python.rest.RESTResponse:
"""Wrapper around ``RESTClientObject.request()`` from SendindBlue SDK
that sets a default timeout and logs the request.
"""
Expand All @@ -25,7 +25,7 @@ def custom_restclient_request(
except Exception as exc:
logger.warning(
"Call to external service failed with %s",
# APIException from sib_api_v3_sdk has a status. Other exceptions don't.
# APIException from brevo_python has a status. Other exceptions don't.
getattr(exc, "status", str(exc)),
extra={
"method": method,
Expand All @@ -37,7 +37,7 @@ def custom_restclient_request(


def monkey_patch_sendinblue() -> None:
from sib_api_v3_sdk.rest import RESTClientObject
from brevo_python.rest import RESTClientObject

RESTClientObject.__orig_request = RESTClientObject.request
RESTClientObject.request = custom_restclient_request
Expand Down
10 changes: 5 additions & 5 deletions api/src/pcapi/notifications/sms/backends/sendinblue.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import logging

import sib_api_v3_sdk
from sib_api_v3_sdk.rest import ApiException
import brevo_python
from brevo_python.rest import ApiException

from pcapi import settings
from pcapi.core import mails
Expand All @@ -15,12 +15,12 @@

class SendinblueBackend:
def __init__(self) -> None:
configuration = sib_api_v3_sdk.Configuration()
configuration = brevo_python.Configuration()
configuration.api_key["api-key"] = settings.SENDINBLUE_API_KEY
self.api_instance = sib_api_v3_sdk.TransactionalSMSApi(sib_api_v3_sdk.ApiClient(configuration))
self.api_instance = brevo_python.TransactionalSMSApi(brevo_python.ApiClient(configuration))

def send_transactional_sms(self, recipient: str, content: str) -> None:
send_transac_sms = sib_api_v3_sdk.SendTransacSms(
send_transac_sms = brevo_python.SendTransacSms(
sender="PassCulture",
recipient=self._format_recipient(recipient),
content=content,
Expand Down
4 changes: 2 additions & 2 deletions api/tests/core/external/pro_user_automations_test.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from unittest.mock import patch

from brevo_python import RequestContactImport
import pytest
from sib_api_v3_sdk import RequestContactImport

from pcapi import settings
from pcapi.core.external.automations.pro_user import pro_no_active_offers_since_40_days_automation
Expand Down Expand Up @@ -40,7 +40,7 @@ def build_expected_called_params(list_id):
class BaseProAutomations:
MOCK_RUN_BQ_QUERY_PATH = "pcapi.connectors.big_query.TestingBackend.run_query"
MOCK_IMPORT_CONTACT_PATH = (
"pcapi.core.external.sendinblue.sib_api_v3_sdk.api.contacts_api.ContactsApi.import_contacts"
"pcapi.core.external.sendinblue.brevo_python.api.contacts_api.ContactsApi.import_contacts"
)

@property
Expand Down
6 changes: 3 additions & 3 deletions api/tests/core/external/sendinblue_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
from unittest.mock import patch
import warnings

from brevo_python.models.request_contact_import import RequestContactImport
import pytest
from sib_api_v3_sdk.models.request_contact_import import RequestContactImport

from pcapi import settings
from pcapi.core.cultural_survey import models as cultural_survey_models
Expand Down Expand Up @@ -272,7 +272,7 @@ def test_build_file_body(self):
result = build_file_body(self.users_data)
assert result == expected

@patch("pcapi.core.external.sendinblue.sib_api_v3_sdk.api.contacts_api.ContactsApi.import_contacts")
@patch("pcapi.core.external.sendinblue.brevo_python.api.contacts_api.ContactsApi.import_contacts")
def test_import_contacts_in_sendinblue(self, mock_import_contacts):
import_contacts_in_sendinblue(self.users_data)

Expand Down Expand Up @@ -304,7 +304,7 @@ def test_import_contacts_in_sendinblue(self, mock_import_contacts):
mock_import_contacts.assert_has_calls([call(expected_young_call), call(expected_pro_call)], any_order=True)

@pytest.mark.parametrize("use_pro_subaccount", [True, False])
@patch("pcapi.core.external.sendinblue.sib_api_v3_sdk.api.contacts_api.ContactsApi.import_contacts")
@patch("pcapi.core.external.sendinblue.brevo_python.api.contacts_api.ContactsApi.import_contacts")
def test_add_contacts_to_list(self, mock_import_contacts, use_pro_subaccount):
result = add_contacts_to_list(
["eren.yeager@shinganshina.paradis", "armin.arlert@shinganshina.paradis"],
Expand Down
2 changes: 1 addition & 1 deletion api/tests/core/external/test_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def test_update_sendinblue_batch_users(app):
users_factories.BeneficiaryGrant18Factory.create_batch(2)

with patch(
"pcapi.core.external.sendinblue.sib_api_v3_sdk.api.contacts_api.ContactsApi.import_contacts"
"pcapi.core.external.sendinblue.brevo_python.api.contacts_api.ContactsApi.import_contacts"
) as mock_import_contacts:
result = run_command(app, "update_sendinblue_batch_users", "--sync-sendinblue")

Expand Down
14 changes: 7 additions & 7 deletions api/tests/core/external/user_automations_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
from datetime import datetime
from unittest.mock import patch

from brevo_python import RequestContactImport
from dateutil.relativedelta import relativedelta
import pytest
from sib_api_v3_sdk import RequestContactImport
import time_machine

from pcapi import settings
Expand Down Expand Up @@ -49,7 +49,7 @@ def test_get_emails_who_will_turn_eighteen_in_one_month(self):
assert sorted(result) == ["fabien+test@example.net", "gerard+test@example.net"]
assert len(User.query.all()) == 6

@patch("pcapi.core.external.sendinblue.sib_api_v3_sdk.api.contacts_api.ContactsApi.import_contacts")
@patch("pcapi.core.external.sendinblue.brevo_python.api.contacts_api.ContactsApi.import_contacts")
def test_user_turned_eighteen_automation(self, mock_import_contacts):
self._create_users_around_18()

Expand Down Expand Up @@ -153,7 +153,7 @@ def test_get_users_beneficiary_three_months_before_credit_expiration(self):
results = user_automations.get_users_beneficiary_credit_expiration_within_next_3_months()
assert sorted([user.email for user in results]) == [user.email for user in users[4:7]]

@patch("pcapi.core.external.sendinblue.sib_api_v3_sdk.api.contacts_api.ContactsApi.import_contacts")
@patch("pcapi.core.external.sendinblue.brevo_python.api.contacts_api.ContactsApi.import_contacts")
def test_users_beneficiary_credit_expiration_within_next_3_months_automation(self, mock_import_contacts):
users = self._create_users_with_deposits()

Expand Down Expand Up @@ -194,7 +194,7 @@ def test_get_users_ex_beneficiary(self):
results = user_automations.get_users_ex_beneficiary()
assert sorted([user.email for user in results]) == [user.email for user in users[1:4] + [users[6]]]

@patch("pcapi.core.external.sendinblue.sib_api_v3_sdk.api.contacts_api.ContactsApi.import_contacts")
@patch("pcapi.core.external.sendinblue.brevo_python.api.contacts_api.ContactsApi.import_contacts")
def test_user_ex_beneficiary_automation(self, mock_import_contacts):
users = self._create_users_with_deposits()

Expand Down Expand Up @@ -240,7 +240,7 @@ def test_get_email_for_inactive_user_since_thirty_days(self):
results = user_automations.get_email_for_inactive_user_since_thirty_days()
assert sorted(results) == sorted([beneficiary.email, not_beneficiary.email])

@patch("pcapi.core.external.sendinblue.sib_api_v3_sdk.api.contacts_api.ContactsApi.import_contacts")
@patch("pcapi.core.external.sendinblue.brevo_python.api.contacts_api.ContactsApi.import_contacts")
def test_users_inactive_since_30_days_automation(self, mock_import_contacts):
with time_machine.travel("2033-08-01 15:00:00") as frozen_time:
users_factories.BeneficiaryGrant18Factory(
Expand Down Expand Up @@ -271,7 +271,7 @@ def test_users_inactive_since_30_days_automation(self, mock_import_contacts):

assert result is True

@patch("pcapi.core.external.sendinblue.sib_api_v3_sdk.api.contacts_api.ContactsApi.import_contacts")
@patch("pcapi.core.external.sendinblue.brevo_python.api.contacts_api.ContactsApi.import_contacts")
def test_users_inactive_since_30_days_automation_no_result(self, mock_import_contacts):
with time_machine.travel("2033-08-01 15:00:00") as frozen_time:
users_factories.BeneficiaryGrant18Factory(
Expand Down Expand Up @@ -311,7 +311,7 @@ def test_get_email_for_users_created_one_year_ago_per_month(self):
results = user_automations.get_email_for_users_created_one_year_ago_per_month()
assert sorted(results) == sorted([user.email for user in matching_users])

@patch("pcapi.core.external.sendinblue.sib_api_v3_sdk.api.contacts_api.ContactsApi.import_contacts")
@patch("pcapi.core.external.sendinblue.brevo_python.api.contacts_api.ContactsApi.import_contacts")
def test_users_nearly_one_year_with_pass_automation(self, mock_import_contacts):
users_factories.UserFactory(email="fabien+test@example.net", dateCreated=datetime(2033, 8, 31))
users_factories.UserFactory(email="pierre+test@example.net", dateCreated=datetime(2033, 9, 1))
Expand Down
4 changes: 2 additions & 2 deletions api/tests/core/external/venue_automations_test.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from datetime import datetime
from unittest.mock import patch

from brevo_python import RequestContactImport
from dateutil.relativedelta import relativedelta
import pytest
from sib_api_v3_sdk import RequestContactImport

from pcapi import settings
import pcapi.core.bookings.factories as bookings_factories
Expand Down Expand Up @@ -92,7 +92,7 @@ def test_get_inactive_venues_emails(self):

assert set(results) == {venue_no_booking.bookingEmail, venue_old_booking.bookingEmail}

@patch("pcapi.core.external.sendinblue.sib_api_v3_sdk.api.contacts_api.ContactsApi.import_contacts")
@patch("pcapi.core.external.sendinblue.brevo_python.api.contacts_api.ContactsApi.import_contacts")
def test_pro_inactive_venues_automation(self, mock_import_contacts):
offerer = offerers_factories.OffererFactory(dateValidated=datetime.utcnow() - relativedelta(days=100))
venue = offerers_factories.VenueFactory(managingOfferer=offerer)
Expand Down
Loading

0 comments on commit 1be26e6

Please sign in to comment.