Skip to content

Commit

Permalink
Attributs structures
Browse files Browse the repository at this point in the history
  • Loading branch information
chloend committed Nov 2, 2024
1 parent 57817e1 commit 34c07f9
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 23 deletions.
4 changes: 2 additions & 2 deletions lemarche/crm/management/commands/crm_brevo_sync_companies.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from lemarche.utils.commands import BaseCommand


ten_days_ago = timezone.now() - timedelta(days=10)
two_weeks_ago = timezone.now() - timedelta(weeks=2)


class Command(BaseCommand):
Expand All @@ -34,7 +34,7 @@ def handle(self, recently_updated: bool, **options):
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=ten_days_ago)
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: loop on the siaes
Expand Down
60 changes: 60 additions & 0 deletions lemarche/crm/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from django.core.management import call_command
from django.test import TestCase

from lemarche.siaes.factories import SiaeFactory
from lemarche.users.factories import UserFactory
from lemarche.utils.apis.api_brevo import create_or_update_company
from lemarche.utils.urls import get_object_admin_url, get_object_share_url

from unittest.mock import patch, MagicMock


class CrmBrevoSyncCompaniesCommandTest(TestCase):
@classmethod
def setUpTestData(cls):
cls.user = UserFactory(api_key="toto")
cls.siae = SiaeFactory(users=[cls.user])

@patch("lemarche.utils.apis.api_brevo.sib_api_v3_sdk.Body")
def test_create_or_update_company_with_mocked_body(self, mock_body):
# Créer un mock pour `Body`
mock_body_instance = MagicMock()
mock_body.return_value = mock_body_instance

# Créer un objet `Siae` de test
siae = SiaeFactory(name="Test Company", completion_rate=0.5)

# Appeler la fonction que l'on souhaite tester
create_or_update_company(siae)

expected_attributes = {
"domain": siae.website,
"phone_number": siae.contact_phone_display,
"app_id": siae.id,
"siae": True,
"active": siae.is_active,
"description": siae.description,
"kind": siae.kind,
"address_street": siae.address,
"address_post_code": siae.post_code,
"address_city": siae.city,
"contact_email": siae.contact_email,
"logo_url": siae.logo_url,
"geo_range": siae.geo_range,
"app_url": get_object_share_url(siae),
"app_admin_url": get_object_admin_url(siae),
# Champs de extra_data
**siae.extra_data, # inclut completion_rate, tender_email_send_count, etc.
}

mock_body.assert_called_once_with(name="Test Company", attributes=expected_attributes)

def test_command_creates_or_updates_siae(self):
siae = SiaeFactory(extra_data={"completion_rate": 0.5})

call_command("crm_brevo_sync_companies")

siae.refresh_from_db()
print(siae)
self.assertIsNotNone(siae.brevo_company_id)
self.assertEqual(siae.extra_data.get("completion_rate"), siae.completion_rate)
66 changes: 45 additions & 21 deletions lemarche/utils/apis/api_brevo.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import json
import logging
import time

import sib_api_v3_sdk

from datetime import timedelta
from django.conf import settings
from django.utils import timezone
from huey.contrib.djhuey import task
from sib_api_v3_sdk.rest import ApiException

Expand Down Expand Up @@ -116,28 +118,50 @@ def create_or_update_company(siae):
api_client = get_api_client()
api_instance = sib_api_v3_sdk.CompaniesApi(api_client)

attributes = {
# default attributes
# name, owner, linked_contacts, revenue, number_of_employees, created_at, last_updated_at, next_activity_date, owner_assign_date, number_of_contacts, number_of_activities, industry # noqa
"domain": siae.website,
"phone_number": siae.contact_phone_display,
# custom attributes
"app_id": siae.id,
"siae": True,
"active": siae.is_active,
"description": siae.description,
"kind": siae.kind,
"address_street": siae.address,
"address_post_code": siae.post_code,
"address_city": siae.city,
"contact_email": siae.contact_email,
"logo_url": siae.logo_url,
"geo_range": siae.geo_range,
"app_url": get_object_share_url(siae),
"app_admin_url": get_object_admin_url(siae),
}

# `TenderSiae` data
now = timezone.now()
three_months_ago = now - timedelta(days=90)
recent_tender_click_dates = siae.tendersiae_set.filter(detail_contact_click_date__gte=three_months_ago)

tender_siae_data = {
"completion_rate": siae.completion_rate,
"tender_email_send_count": siae.tender_email_send_count, # tenders received
"recent_tender_click_dates_count": recent_tender_click_dates.count(), # tenders clicked
}

if siae.extra_data is None:
siae.extra_data = {}

if siae.extra_data != tender_siae_data:
siae.extra_data = tender_siae_data
siae.save(update_fields=["extra_data"])

attributes.update(siae.extra_data)

siae_brevo_company_body = sib_api_v3_sdk.Body(
name=siae.name,
attributes={
# default attributes
# name, owner, linked_contacts, revenue, number_of_employees, created_at, last_updated_at, next_activity_date, owner_assign_date, number_of_contacts, number_of_activities, industry # noqa
"domain": siae.website,
"phone_number": siae.contact_phone_display,
# custom attributes
"app_id": siae.id,
"siae": True,
"active": siae.is_active,
"description": siae.description,
"kind": siae.kind,
"address_street": siae.address,
"address_post_code": siae.post_code,
"address_city": siae.city,
"contact_email": siae.contact_email,
"logo_url": siae.logo_url,
"geo_range": siae.geo_range,
"app_url": get_object_share_url(siae),
"app_admin_url": get_object_admin_url(siae),
},
attributes=attributes,
)

if siae.brevo_company_id: # update
Expand Down

0 comments on commit 34c07f9

Please sign in to comment.