Skip to content

Commit 7aab45f

Browse files
committed
ajouter un index lors de la résolution de mapping
1 parent c3e6cea commit 7aab45f

File tree

4 files changed

+102
-1
lines changed

4 files changed

+102
-1
lines changed

dags/sources/tasks/business_logic/keep_acteur_changed.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,18 @@ def retrieve_identifiant_unique_from_existing_acteur(
9191
axis=1,
9292
)
9393

94+
# find the duplicated identifiant in df_acteur_from_db and raise if any because
95+
# we can't resolve simply the mapping between source and db
96+
duplicates = df_acteur_from_db[
97+
df_acteur_from_db.duplicated("identifiant", keep=False)
98+
]
99+
if not duplicates.empty:
100+
logger.warning(
101+
"Duplicated identifiant in df_acteur_from_db"
102+
f" {duplicates["identifiant"].tolist()}"
103+
)
104+
raise ValueError("Duplicated identifiant in df_acteur_from_db")
105+
94106
# Replace identifiant_unique (from source) by identifiant (from db) for acteur
95107
# which doesn't have corelation between source, external_id and identifiant_unique
96108
df_normalized.set_index("identifiant", inplace=True)

dags_unit_tests/sources/tasks/business_logic/test_keep_acteur_changed.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,3 +991,72 @@ def test_keep_acteur_changed_same_acteur_but_different_identifiant_unique(dag_co
991991
pd.testing.assert_frame_equal(df_acteur, df_expected, check_dtype=False)
992992
pd.testing.assert_frame_equal(df_acteur_from_db, df_expected, check_dtype=False)
993993
assert metadata == {}
994+
995+
996+
def test_keep_acteur_changed_same_acteur_but_different_identifiant_unique2(dag_config):
997+
df_normalized = pd.DataFrame(
998+
{
999+
"nom": ["nom 1", "nom 2"],
1000+
"identifiant_unique": ["source1_id1", "source1_id2"],
1001+
"source_code": ["source1", "source1"],
1002+
"identifiant_externe": ["id1", "id2"],
1003+
"label_codes": [[], []],
1004+
"acteur_type_code": [[], []],
1005+
"acteur_service_codes": [[], []],
1006+
"proposition_service_codes": [[], []],
1007+
}
1008+
)
1009+
df_acteur_from_db = pd.DataFrame(
1010+
{
1011+
"nom": ["nom 1", "nom 3"],
1012+
"identifiant_unique": ["source1_id_old", "source1_id3"],
1013+
"source_code": ["source1", "source1"],
1014+
"identifiant_externe": ["id1", "id3"],
1015+
"label_codes": [[], []],
1016+
"acteur_type_code": [[], []],
1017+
"acteur_service_codes": [[], []],
1018+
"proposition_service_codes": [[], []],
1019+
}
1020+
)
1021+
df_expected = pd.DataFrame(
1022+
{
1023+
"nom": ["nom 2"],
1024+
"identifiant_unique": ["source1_id2"],
1025+
"source_code": ["source1"],
1026+
"identifiant_externe": ["id2"],
1027+
"label_codes": [[]],
1028+
"acteur_type_code": [[]],
1029+
"acteur_service_codes": [[]],
1030+
"proposition_service_codes": [[]],
1031+
}
1032+
)
1033+
df_expected_from_db = pd.DataFrame(
1034+
{
1035+
"nom": ["nom 3"],
1036+
"identifiant_unique": ["source1_id3"],
1037+
"source_code": ["source1"],
1038+
"identifiant_externe": ["id3"],
1039+
"label_codes": [[]],
1040+
"acteur_type_code": [[]],
1041+
"acteur_service_codes": [[]],
1042+
"proposition_service_codes": [[]],
1043+
}
1044+
)
1045+
1046+
df_acteur, df_acteur_from_db, metadata = keep_acteur_changed(
1047+
df_normalized=df_normalized,
1048+
df_acteur_from_db=df_acteur_from_db,
1049+
dag_config=dag_config,
1050+
)
1051+
1052+
pd.testing.assert_frame_equal(
1053+
df_acteur.reset_index(drop=True),
1054+
df_expected.reset_index(drop=True),
1055+
check_dtype=False,
1056+
)
1057+
pd.testing.assert_frame_equal(
1058+
df_acteur_from_db.reset_index(drop=True),
1059+
df_expected_from_db.reset_index(drop=True),
1060+
check_dtype=False,
1061+
)
1062+
assert metadata == {}

qfdmo/admin/acteur.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ class BaseActeurAdmin(admin.GISModelAdmin):
155155
"siret",
156156
"siren",
157157
"identifiant_unique",
158+
"identifiant_externe",
158159
"code_postal",
159160
"ville",
160161
"adresse",
@@ -163,6 +164,7 @@ class BaseActeurAdmin(admin.GISModelAdmin):
163164
search_fields = [
164165
"code_postal",
165166
"identifiant_unique",
167+
"identifiant_externe",
166168
"nom__unaccent",
167169
"siret",
168170
"siren",

qfdmo/management/commands/update_external_ids.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from django.core.management.base import BaseCommand
55

6-
from qfdmo.models.acteur import Acteur, RevisionActeur
6+
from qfdmo.models.acteur import Acteur, ActeurStatus, RevisionActeur
77

88
CHUNK = 1000
99

@@ -53,6 +53,22 @@ def handle(self, *args, **options):
5353
)
5454
continue
5555

56+
# test acteur with this new external id already exists
57+
acteur_from_db = Acteur.objects.filter(
58+
identifiant_externe=new_id, source__code=source_code
59+
).first()
60+
id_index = 0
61+
while acteur_from_db:
62+
id_index += 1
63+
new_id_indexed = f"{new_id}_{id_index}"
64+
acteur_from_db = Acteur.objects.filter(
65+
identifiant_externe=new_id_indexed, source__code=source_code
66+
).first()
67+
statut = ActeurStatus.ACTIF
68+
if id_index:
69+
new_id = f"{new_id}_{id_index}"
70+
statut = ActeurStatus.INACTIF
71+
5672
# Update acteur if exists
5773
acteur = Acteur.objects.filter(
5874
identifiant_externe=old_id, source__code=source_code
@@ -69,6 +85,7 @@ def handle(self, *args, **options):
6985
)
7086
)
7187
acteur.identifiant_externe = new_id
88+
acteur.statut = statut
7289
acteur.save()
7390
else:
7491
self.stdout.write(
@@ -90,6 +107,7 @@ def handle(self, *args, **options):
90107
)
91108
)
92109
revision_acteur.identifiant_externe = new_id
110+
revision_acteur.statut = statut
93111
revision_acteur.save()
94112
if revision_acteur and dry_run:
95113
self.stdout.write(

0 commit comments

Comments
 (0)