Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(brevo): créer les objets dans Brevo lors de leur création en BDD #1651

Open
wants to merge 23 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
a4249ba
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
19fe7be
chore(brevo): remove unused method
Feb 4, 2025
5bb90f3
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
aa09837
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
ddc8ed7
chore(brevo): remove contact update logic
Feb 4, 2025
7e6ca82
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
abd2771
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
58f6de6
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
2c58a71
chore(brevo): add typing to api_brevo
Feb 4, 2025
3d8866e
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
ef21e68
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
f9e9564
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
445a7b1
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
7e584d3
feat(brevo): create companies and siaes on instance creation
Feb 4, 2025
9f39bae
chore(brevo): set id as char field
Feb 6, 2025
ab11d73
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
e348c1c
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
91df996
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
4a2cfd5
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
62eb3f3
feat(brevo): create companies and siaes on instance creation
Feb 4, 2025
b79f2f9
fix(Besoins): réduit le nombre de mails de relances envoyés aux struc…
raphodn Apr 17, 2024
4ad29c8
feat(brevo): create all tenders in Brevo on validation
Feb 4, 2025
7498885
feat(brevo): small changes after review
Feb 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 0 additions & 22 deletions clevercloud/crm_brevo_sync_companies.sh

This file was deleted.

3 changes: 1 addition & 2 deletions clevercloud/cron.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
"25 7 * * 1 $ROOT/clevercloud/siaes_update_count_fields.sh",
"30 7 * * 1 $ROOT/clevercloud/siaes_update_super_badge_field.sh",
"50 7 * * 1 $ROOT/clevercloud/companies_update_users_and_count_fields.sh",
"55 7 * * 1 $ROOT/clevercloud/crm_brevo_sync_companies.sh",
nicolasabrn marked this conversation as resolved.
Show resolved Hide resolved
"0 7 * * 2 $ROOT/clevercloud/siaes_send_completion_reminder_emails.sh",
"30 7 * * * $ROOT/clevercloud/tenders_send_author_list_of_super_siaes_emails.sh",
"0 8 * * * $ROOT/clevercloud/siaes_send_user_request_reminder_emails.sh",
Expand All @@ -20,4 +19,4 @@
"0 9 * * * $ROOT/clevercloud/tenders_send_siae_contacted_reminder_emails.sh",
"10 9 * * * $ROOT/clevercloud/tenders_send_siae_interested_reminder_emails.sh",
"*/5 8-15 * * 1-5 $ROOT/clevercloud/tenders_send_validated.sh"
]
]
19 changes: 19 additions & 0 deletions lemarche/companies/migrations/0006_company_brevo_company_id.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 4.2.17 on 2025-02-06 14:36

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("companies", "0005_company_linkedin_buyer_count"),
]

operations = [
migrations.AddField(
model_name="company",
name="brevo_company_id",
field=models.CharField(
blank=True, help_text="Identifiant de l'entreprise dans Brevo", null=True, verbose_name="ID Brevo"
),
),
]
17 changes: 17 additions & 0 deletions lemarche/companies/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from django.template.defaultfilters import slugify
from django.utils import timezone
from django_better_admin_arrayfield.models.fields import ArrayField
from django.db.models.signals import post_save
from django.dispatch import receiver

from lemarche.utils.constants import ADMIN_FIELD_HELP_TEXT, RECALCULATED_FIELD_HELP_TEXT

Expand Down Expand Up @@ -52,6 +54,13 @@ class Company(models.Model):
created_at = models.DateTimeField(verbose_name="Date de création", default=timezone.now)
updated_at = models.DateTimeField(verbose_name="Date de modification", auto_now=True)

brevo_company_id = models.CharField(
Guilouf marked this conversation as resolved.
Show resolved Hide resolved
verbose_name="ID Brevo",
help_text="Identifiant de l'entreprise dans Brevo",
blank=True,
null=True,
)

objects = models.Manager.from_queryset(CompanyQuerySet)()

class Meta:
Expand All @@ -72,3 +81,11 @@ def save(self, *args, **kwargs):
"""Generate the slug field before saving."""
self.set_slug()
super().save(*args, **kwargs)


@receiver(post_save, sender=Company)
def create_company_in_brevo(sender, instance, created, **kwargs):
if created:
from lemarche.utils.apis.api_brevo import create_brevo_company_from_company

create_brevo_company_from_company(instance)
Empty file.
49 changes: 49 additions & 0 deletions lemarche/companies/tests/test_models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from unittest.mock import patch, MagicMock

from django.test import TestCase

from lemarche.companies.factories import CompanyFactory


class CompanySignalTest(TestCase):
@patch("lemarche.utils.apis.api_brevo.create_company")
def test_create_company_in_brevo_signal(self, mock_create_company):
"""Test that creating a new company triggers the Brevo sync"""
# Create a new company
company = CompanyFactory()

# Verify create_company was called once with the company instance
mock_create_company.assert_called_once_with(company)

# Create another company
company2 = CompanyFactory()
self.assertEqual(mock_create_company.call_count, 2)
mock_create_company.assert_called_with(company2)

# Update existing company
company.name = "Updated Name"
company.save()

# Call count should still be 2 since we only sync on creation
self.assertEqual(mock_create_company.call_count, 2)

@patch("lemarche.utils.apis.api_brevo.sib_api_v3_sdk.CompaniesApi")
def test_company_attributes_sent_to_brevo(self, mock_companies_api):
"""Test the attributes sent to Brevo when creating a company"""
# Setup the mock response
mock_response = MagicMock()
mock_response.id = 12345
mock_instance = mock_companies_api.return_value
mock_instance.companies_post.return_value = mock_response

# Create a company
company = CompanyFactory(name="Test Company", website="https://example.com")

# Get the Body instance that was passed to companies_post
args, kwargs = mock_instance.companies_post.call_args
body_obj = args[0]

self.assertEqual(body_obj.name, "Test Company")
self.assertEqual(body_obj.attributes, {"domain": "https://example.com", "app_id": company.id, "siae": False})

self.assertEqual(company.brevo_company_id, 12345)
File renamed without changes.
24 changes: 3 additions & 21 deletions lemarche/crm/management/commands/crm_brevo_sync_companies.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,34 +30,16 @@ def handle(self, recently_updated: bool, **options):
self.stdout.write("Script to sync Siaes with Brevo CRM (companies)...")

# Step 1: build the queryset
siaes_qs = Siae.objects.all()
siaes_qs = Siae.objects.filter(brevo_company_id__isnull=True)
nicolasabrn marked this conversation as resolved.
Show resolved Hide resolved
self.stdout.write(f"Sync Siae > Brevo: we have {Siae.objects.count()} siaes")
# Update only the recently updated siaes
if recently_updated:
siaes_qs = siaes_qs.filter(updated_at__gte=two_weeks_ago)
self.stdout.write(f"Sync Siae > Brevo: {siaes_qs.count()} recently updated")

# Step 2: Add the 90-day limited annotations
siaes_qs = siaes_qs.with_tender_stats(since_days=90)

# Step 3: loop on the siaes
# Step 2: loop on the siaes
for index, siae in enumerate(siaes_qs):
new_extra_data = {
"completion_rate": siae.completion_rate if siae.completion_rate is not None else 0,
"tender_received": siae.tender_email_send_count_annotated,
"tender_interest": siae.tender_detail_contact_click_count_annotated,
}

# extra_data update if needed
if siae.extra_data.get("brevo_company_data") != new_extra_data:
siae.extra_data.update(
{
"brevo_company_data": new_extra_data,
}
)
siae.save(update_fields=["extra_data"])

api_brevo.create_or_update_company(siae)
api_brevo.create_brevo_company_from_siae(siae)
if (index % 10) == 0: # avoid API rate-limiting
time.sleep(1)
if (index % 500) == 0:
Expand Down
Loading
Loading