Skip to content

Commit 441f996

Browse files
Merge branch 'main' into llm.json
2 parents 9d379d4 + 0e6ad20 commit 441f996

12 files changed

Lines changed: 105 additions & 4 deletions

File tree

Procfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
web: gunicorn --config gunicorn_conf.py docia.wsgi
22
worker: celery --app docia worker -l INFO --concurrency=2
3+
postdeploy: python manage.py migrate
4+

docia/context_processors.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ def settings(request):
66
"settings": {
77
"PROCONNECT_ALLOWED": dj_settings.PROCONNECT_ALLOWED,
88
"TCHAP_SUPPORT_CANAL_URL": dj_settings.TCHAP_SUPPORT_CANAL_URL,
9+
"MATOMO_URL": dj_settings.MATOMO_URL,
910
}
1011
}
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/settings.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,3 +333,6 @@
333333
"TEST_REQUEST_DEFAULT_FORMAT": "json",
334334
"NON_FIELD_ERRORS_KEY": "non_field_errors",
335335
}
336+
337+
338+
MATOMO_URL = config.str("MATOMO_URL", default="")

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

docia/templates/docia/auth/login.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{% extends "dsfr/base.html" %}
1+
{% extends "docia/base.html" %}
22

33

44
{% block header %}

docia/templates/docia/base.html

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,21 @@
44
<title>Dépenses Éclairées</title>
55
{% endblock %}
66

7+
{% block opengraph %}
8+
{% if settings.MATOMO_URL %}
9+
<!-- Matomo Tag Manager -->
10+
<script>
11+
var _mtm = window._mtm = window._mtm || [];
12+
_mtm.push({'mtm.startTime': (new Date().getTime()), 'event': 'mtm.Start'});
13+
(function() {
14+
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
15+
g.async=true; g.src='{{ settings.MATOMO_URL }}'; s.parentNode.insertBefore(g,s);
16+
})();
17+
</script>
18+
<!-- End Matomo Tag Manager -->
19+
{% endif %}
20+
{% endblock opengraph %}
21+
722
{% block header %}
823
{% include "docia/blocks/header.html" %}
924
{% endblock header %}

0 commit comments

Comments
 (0)