Skip to content

Commit fd1fc18

Browse files
committed
Add script to sync engagement items from CSV
1 parent ed6566a commit fd1fc18

5 files changed

Lines changed: 80 additions & 2 deletions

File tree

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import os
2+
3+
from django.core.management.base import BaseCommand, CommandError
4+
5+
from docia.sync.sync_engagement_items import read_csv, sync
6+
7+
8+
class Command(BaseCommand):
9+
help = "Syncs engagement items from a CSV file to the database"
10+
11+
def add_arguments(self, parser):
12+
parser.add_argument("filename", type=str, help="Path to the CSV file to import")
13+
14+
def handle(self, *args, **options):
15+
filename = options["filename"]
16+
17+
# Check if file exists
18+
if not os.path.exists(filename):
19+
raise CommandError(f'File "{filename}" does not exist')
20+
21+
data = read_csv(filename)
22+
self.stdout.write(self.style.SUCCESS(f"Found {len(data)} items in CSV file"))
23+
24+
# Perform the sync operation
25+
created = sync(data)
26+
27+
self.stdout.write(self.style.SUCCESS(f"Successfully synced engagement items ({len(created)} created)"))
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.2.7 on 2025-10-14 14:33
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('docia', '0006_trackingevent'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='dataengagementitems',
15+
name='num_ej',
16+
field=models.CharField(max_length=20),
17+
),
18+
]

docia/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class DataEngagementItems(models.Model):
8888
db_default=RandomUUID(),
8989
editable=False,
9090
)
91-
num_ej = models.ForeignKey(DataEngagement, on_delete=models.CASCADE, db_column="num_ej", to_field="num_ej")
91+
num_ej = models.CharField(max_length=20)
9292
poste_ej = models.CharField()
9393
num_contrat = models.CharField(null=True, blank=True) # noqa: DJ001
9494
groupe_marchandise = models.CharField(null=True, blank=True) # noqa: DJ001
@@ -99,7 +99,7 @@ class Meta:
9999
unique_together = [("num_ej", "poste_ej")]
100100

101101
def __str__(self):
102-
return f"{self.num_ej_id} - {self.poste_ej}"
102+
return f"{self.num_ej} - {self.poste_ej}"
103103

104104

105105
class DataProgrammesMinisteriels(models.Model):

docia/sync/__init__.py

Whitespace-only changes.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import csv
2+
3+
from django.db.models import F, Value
4+
from django.db.models.functions import Concat
5+
6+
from docia.models import DataEngagementItems
7+
8+
9+
def read_csv(filename):
10+
with open(filename, "r") as file:
11+
reader = csv.DictReader(file, delimiter=";")
12+
data = []
13+
for row in reader:
14+
item = DataEngagementItems(**row)
15+
data.append(item)
16+
return data
17+
18+
19+
def sync(data):
20+
to_create = []
21+
num_ejs = [f"{item.num_ej}__{item.poste_ej}" for item in data]
22+
existing_items = list(
23+
DataEngagementItems.objects.annotate(
24+
key=Concat(F("num_ej"), Value("__"), F("poste_ej")),
25+
)
26+
.filter(key__in=num_ejs)
27+
.values_list("key", flat=True)
28+
)
29+
for item in data:
30+
if f"{item.num_ej}__{item.poste_ej}" not in existing_items:
31+
to_create.append(item)
32+
created = DataEngagementItems.objects.bulk_create(to_create)
33+
return created

0 commit comments

Comments
 (0)