Skip to content

Commit

Permalink
Merge branch 'main' into assistant-feedbacks-22-1
Browse files Browse the repository at this point in the history
  • Loading branch information
fabienheureux authored Jan 25, 2025
2 parents 81484f2 + 6d1d9ec commit 00cd9eb
Show file tree
Hide file tree
Showing 13 changed files with 222 additions and 52 deletions.
28 changes: 0 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -450,34 +450,6 @@ flowchart TB
PropositionService --> DisplayedPropositionService
```

## Conventions de code - Utilisation des langues françaises et anglaises

Nous suivons les règles et standards de l'industrie que nous contrôlons à chaque commit et Pull Request grâce à des outils tel que `ruff` ou `eslint`.

Cependant, ce projet est développé et propulsé par l'État français et doit être utilisable et administrable simplement par le plus grand nombre. Nous appliquons donc une règle spécifique quant à l'utilisation de la langue française versus la langue anglaise, nous avons donc défini les cas d'utilisation de ces 2 langues.

### En Français

A l'attention des administrés, administrations, administrateurs, et l'équipe Longue vie aux objets

- Git/Github Les commits, les Pull Request
- La documentation dans les markdowns
- Les noms et les champs des tables en base de données

### En Anglais

Dans le code, à l'attention des équipes techniques

- les fonctions
- les noms de variables
- les commentaires dans le code

### Effets de bord acceptés

Certaines variables combinant un nom d'objet et un suffixe ou préfixe peuvent être en franglais

Ex : `acteur_by_id`

## Data platform

Longue vie aux objets est aussi une `data platform` dont la documentation est dans [README.airflow.md](./README.airflow.md)
Expand Down
28 changes: 28 additions & 0 deletions docs/reference/902-utilisation-du-francais-et-de-l-anglais.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Conventions de code - Utilisation des langues françaises et anglaises

Nous suivons les règles et standards de l'industrie que nous contrôlons à chaque commit et Pull Request grâce à des outils tel que `ruff` ou `eslint`.

Cependant, ce projet est développé et propulsé par l'État français et doit être utilisable et administrable simplement par le plus grand nombre. Nous appliquons donc une règle spécifique quant à l'utilisation de la langue française versus la langue anglaise, nous avons donc défini les cas d'utilisation de ces 2 langues.

## En Français

A l'attention des administrés, administrations, administrateurs, et l'équipe Longue vie aux objets

- Git/Github Les commits, les Pull Request
- La documentation dans les markdowns
- Les noms et les champs des tables en base de données

## En Anglais

Dans le code, à l'attention des équipes techniques

- les fonctions
- les noms de variables
- les messages d'erreur des exceptions
- les commentaires dans le code

## Effets de bord acceptés

Certaines variables combinant un nom d'objet et un suffixe ou préfixe peuvent être en franglais

Ex : `acteur_by_id`
1 change: 1 addition & 0 deletions docs/reference/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@
301-db-guidelines.md
302-organisations-des-fichiers-data.md
901-documentation-technique.md
902-utilisation-du-francais-et-de-l-anglais.md
```
63 changes: 63 additions & 0 deletions qfdmo/migrations/0114_action_models_code.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Generated by Django 5.1.4 on 2025-01-23 10:08

from django.db import migrations, models

import qfdmo.validators


class Migration(migrations.Migration):

dependencies = [
("qfdmo", "0113_delete_parents_without_children"),
]

operations = [
migrations.AlterField(
model_name="action",
name="code",
field=models.CharField(
max_length=255,
unique=True,
validators=[qfdmo.validators.CodeValidator()],
),
),
migrations.AlterField(
model_name="actiondirection",
name="code",
field=models.CharField(
max_length=255,
unique=True,
validators=[qfdmo.validators.CodeValidator()],
),
),
migrations.AlterField(
model_name="groupeaction",
name="code",
field=models.CharField(
max_length=255,
unique=True,
validators=[qfdmo.validators.CodeValidator()],
),
),
migrations.AddConstraint(
model_name="action",
constraint=models.CheckConstraint(
condition=models.Q(("code__regex", "^[0-9a-z_]+$")),
name="action_code_format",
),
),
migrations.AddConstraint(
model_name="actiondirection",
constraint=models.CheckConstraint(
condition=models.Q(("code__regex", "^[0-9a-z_]+$")),
name="action_direction_code_format",
),
),
migrations.AddConstraint(
model_name="groupeaction",
constraint=models.CheckConstraint(
condition=models.Q(("code__regex", "^[0-9a-z_]+$")),
name="groupe_action_code_format",
),
),
]
34 changes: 34 additions & 0 deletions qfdmo/migrations/0115_acteur_models_code_constraint.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Generated by Django 5.1.4 on 2025-01-23 10:18

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("qfdmo", "0114_action_models_code"),
]

operations = [
migrations.AddConstraint(
model_name="acteurservice",
constraint=models.CheckConstraint(
condition=models.Q(("code__regex", "^[0-9a-z_]+$")),
name="acteur_service_code_format",
),
),
migrations.AddConstraint(
model_name="acteurtype",
constraint=models.CheckConstraint(
condition=models.Q(("code__regex", "^[0-9a-z_]+$")),
name="acteur_type_code_format",
),
),
migrations.AddConstraint(
model_name="source",
constraint=models.CheckConstraint(
condition=models.Q(("code__regex", "^[0-9a-z_]+$")),
name="source_code_format",
),
),
]
27 changes: 26 additions & 1 deletion qfdmo/models/acteur.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,16 @@
from django.contrib.gis.geos.geometry import GEOSGeometry
from django.core.cache import cache
from django.core.files.images import get_image_dimensions
from django.db.models import Case, Exists, Min, OuterRef, Q, Value, When
from django.db.models import (
Case,
CheckConstraint,
Exists,
Min,
OuterRef,
Q,
Value,
When,
)
from django.forms import ValidationError, model_to_dict
from django.http import HttpRequest
from django.urls import reverse
Expand Down Expand Up @@ -45,6 +54,12 @@ class Meta:
ordering = ["libelle"]
verbose_name = "Service proposé"
verbose_name_plural = "Services proposés"
constraints = [
CheckConstraint(
check=Q(code__regex=CodeValidator.regex),
name="acteur_service_code_format",
),
]

id = models.AutoField(primary_key=True)
code = models.CharField(
Expand Down Expand Up @@ -97,6 +112,11 @@ class ActeurType(CodeAsNaturalKeyModel):
class Meta:
verbose_name = "Type d'acteur"
verbose_name_plural = "Types d'acteur"
constraints = [
CheckConstraint(
check=Q(code__regex=CodeValidator.regex), name="acteur_type_code_format"
),
]

id = models.AutoField(primary_key=True)
code = models.CharField(
Expand Down Expand Up @@ -129,6 +149,11 @@ class Source(CodeAsNaturalKeyModel):
class Meta:
verbose_name = "Source de données"
verbose_name_plural = "Sources de données"
constraints = [
CheckConstraint(
check=Q(code__regex=CodeValidator.regex), name="source_code_format"
),
]

id = models.AutoField(primary_key=True)
libelle = models.CharField(max_length=255)
Expand Down
43 changes: 40 additions & 3 deletions qfdmo/models/action.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,35 @@
from colorfield.fields import ColorField
from django.contrib.gis.db import models
from django.core.cache import cache
from django.db.models import CheckConstraint, Q
from django.db.models.query import QuerySet
from django.forms import model_to_dict
from django.utils.functional import cached_property

from dsfr_hacks.colors import DSFRColors
from qfdmo.models.utils import CodeAsNaturalKeyManager, CodeAsNaturalKeyModel
from qfdmo.validators import CodeValidator


class ActionDirection(CodeAsNaturalKeyModel):
class Meta:
verbose_name = "Direction de l'action"
verbose_name_plural = "Directions de l'action"
constraints = [
CheckConstraint(
check=Q(code__regex=CodeValidator.regex),
name="action_direction_code_format",
),
]

id = models.AutoField(primary_key=True)
code = models.CharField(max_length=255, unique=True, blank=False, null=False)
code = models.CharField(
max_length=255,
unique=True,
blank=False,
null=False,
validators=[CodeValidator()],
)
order = models.IntegerField(blank=False, null=False, default=0)
libelle = models.CharField(max_length=255, unique=True, blank=False, null=False)

Expand Down Expand Up @@ -52,9 +66,21 @@ class GroupeAction(CodeAsNaturalKeyModel):
class Meta:
verbose_name = "Groupe d'actions"
verbose_name_plural = "Groupes d'actions"
constraints = [
CheckConstraint(
check=Q(code__regex=CodeValidator.regex),
name="groupe_action_code_format",
),
]

id = models.AutoField(primary_key=True)
code = models.CharField(max_length=255, unique=True, blank=False, null=False)
code = models.CharField(
max_length=255,
unique=True,
blank=False,
null=False,
validators=[CodeValidator()],
)
afficher = models.BooleanField(default=True)
description = models.CharField(max_length=255, null=True, blank=True)
order = models.IntegerField(blank=False, null=False, default=0)
Expand Down Expand Up @@ -103,9 +129,20 @@ def libelle(self):
class Action(CodeAsNaturalKeyModel):
class Meta:
ordering = ["order"]
constraints = [
CheckConstraint(
check=Q(code__regex=CodeValidator.regex), name="action_code_format"
),
]

id = models.AutoField(primary_key=True)
code = models.CharField(max_length=255, unique=True, blank=False, null=False)
code = models.CharField(
max_length=255,
unique=True,
blank=False,
null=False,
validators=[CodeValidator()],
)
libelle = models.CharField(max_length=255, null=False, default="")
libelle_groupe = models.CharField(
max_length=255,
Expand Down
2 changes: 1 addition & 1 deletion qfdmo/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@


class CodeValidator(RegexValidator):
regex = r"^[a-z_]+$"
regex = r"^[0-9a-z_]+$"
message = (
"Le champ `code` ne doit contenir que des caractères en minuscule et des"
" underscores."
Expand Down
19 changes: 14 additions & 5 deletions unit_tests/qfdmo/acteur_factory.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import random
import string

import factory.fuzzy
from django.contrib.gis.geos import Point
from factory import Faker, SubFactory
from factory import Faker, LazyFunction, SubFactory
from factory.django import DjangoModelFactory as Factory

from qfdmo.models import (
Expand All @@ -17,13 +20,19 @@
from unit_tests.qfdmo.action_factory import ActionFactory


def generate_random_word():
length = 10
characters = string.ascii_lowercase + string.digits + "_"
return "".join(random.choice(characters) for _ in range(length))


class SourceFactory(Factory):
class Meta:
model = Source
django_get_or_create = ("code",)

libelle = Faker("word")
code = Faker("word")
code = LazyFunction(generate_random_word)
afficher = True


Expand All @@ -33,7 +42,7 @@ class Meta:
django_get_or_create = ("code",)

libelle = Faker("word")
code = Faker("word")
code = LazyFunction(generate_random_word)
afficher = True


Expand All @@ -42,7 +51,7 @@ class Meta:
model = ActeurType
django_get_or_create = ("code",)

code = Faker("word")
code = LazyFunction(generate_random_word)


class ActeurFactory(Factory):
Expand Down Expand Up @@ -81,7 +90,7 @@ class Meta:
model = ActeurService
django_get_or_create = ("code",)

code = Faker("word")
code = LazyFunction(generate_random_word)


class PropositionServiceFactory(Factory):
Expand Down
Loading

0 comments on commit 00cd9eb

Please sign in to comment.