Skip to content

Commit d99e45e

Browse files
authored
[Backend][Frontend] feat: Bureau de vote (#2399)
* feat: bureau de vote * chore: bugfix clipboard copy on erp details page * chore: conftest updated
1 parent 1bfaba7 commit d99e45e

26 files changed

+541
-62
lines changed

.talismanrc

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,23 @@ fileignoreconfig:
66
- filename: compte/forms.py
77
checksum: 028d3dedb8a51279d03b9c3c4ca6729a7e1cb3c5b96ce653fb6171517f5f238e
88
- filename: templates/contrib/7-commentaire.html
9-
checksum: 37ac9503a7a7eb19da77d8aa2aed6dbd4fa377ff652a3676556eb213a243dac6
9+
checksum: 46dbc17a97dfe7ffb619c0281c4989d02ac40a17603b696701d00132384a9dbf
1010
- filename: erp/export/static/schema.json
11-
checksum: 77087c4bffb29dd0c1567f2033a38d9f6c28da95a9ca0e0884ed0658aca083a2
11+
checksum: 2e3f20cf7ed1d425786c05f1deb3521af30d80c3e2c86f55861bab785a4fc111
1212
- filename: core/settings.py
1313
checksum: 269e587476da3314cbd43665307b6942ecf3185fce3c2c078c07a947eac25be2
1414
- filename: .isort.cfg
1515
checksum: 888e09b1fe8ead28a4561b05842cd852be1ca8a3b86264aa48469514f93cfdd2
1616
- filename: templates/contrib/6-accueil.html
17-
checksum: d2cc6434173e01aac59b409246ef6011224d4048a847082dc3419028b991e804
17+
checksum: ff33a16b84affad2023c03bea2fea487abcf6d6aaa314652a8a97b5bc4b43c5e
1818
- filename: locale/en/LC_MESSAGES/django.po
19-
checksum: d4304401956ce11f21470efcb59053e170cadd11f7d200a441dda74fe94df57b
19+
checksum: 47299c43a90e25532c8dc508aae0e1b6103bfabbfb35bf86da08a046f8b8e86d
2020
- filename: templates/contrib/0-start.html
2121
checksum: 48b03ff89169260f34f59c6ce3f07e219d13ebfb7c11ee3dbbf319ea70d4063f
2222
- filename: templates/contrib/0a-search_results.html
2323
checksum: b0da6abb831f6b6bb31501322bec85df53a3e5ab0ba086546115582f514eac1d
2424
- filename: templates/contrib/5-entree.html
25-
checksum: fa04eedf8a81dd013d9222ae9c20d69f04cdee402085a17326f162767934a07e
25+
checksum: 1cc959485e4164c86f548e532fadfa8ea7c4cc55db6637b6ea822c87c5981acf
2626
- filename: templates/contrib/4-exterieur.html
2727
checksum: 4e6911a34b51f640e0fb6a2dad359628daf63459f2b3d868ce0d80ce094f8538
2828
- filename: .circleci/config.yml
@@ -35,3 +35,5 @@ fileignoreconfig:
3535
checksum: 5dbcf869ea896e92c4ea66c628d19c5b977b6990dfe136d9909d5b9d98dfaa95
3636
- filename: templates/registration/password_reset_form.html
3737
checksum: 67a51a996f615b77ecbdafd25f1e02a14c5fc2dad5c3de674bb6e49bc00f10fb
38+
- filename: templates/contrib/3-transport.html
39+
checksum: 31cb1838db8607f44c92e00e0841c18f7454943ea3a600d79f943fae2f967874

conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ def activite(db):
136136
"Bureau de change",
137137
"Bureau de douane",
138138
"Bureau de poste",
139+
"Bureau de vote",
139140
"Café, bar, brasserie",
140141
"Caisse d'allocations familiales (caf)",
141142
"Camping caravaning",

erp/export/mappers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class EtalabMapper(BaseExportMapper):
2323
longitude: float
2424
latitude: float
2525
transport_station_presence: bool
26+
transport_bureau_de_vote_accessibilite: bool
2627
stationnement_presence: bool
2728
stationnement_pmr: bool
2829
stationnement_ext_presence: bool
@@ -100,6 +101,8 @@ class EtalabMapper(BaseExportMapper):
100101
accueil_chambre_equipement_alerte: bool
101102
accueil_chambre_accompagnement: bool
102103
accueil_retrecissement: bool
104+
accueil_isoloir_accessibilite: bool
105+
accueil_urne_accessibilite: bool
103106
sanitaires_presence: bool
104107
sanitaires_adaptes: int
105108
labels: Optional[Set[Literal["autre", "dpt", "mobalib", "th", "handiplage"]]]
@@ -133,6 +136,7 @@ def map_from(erp) -> "EtalabMapper":
133136
longitude=map_coords(erp.geom, 0),
134137
latitude=map_coords(erp.geom, 1),
135138
transport_station_presence=erp.accessibilite.transport_station_presence,
139+
transport_bureau_de_vote_accessibilite=erp.accessibilite.transport_bureau_de_vote_accessibilite,
136140
stationnement_presence=erp.accessibilite.stationnement_presence,
137141
stationnement_pmr=erp.accessibilite.stationnement_pmr,
138142
stationnement_ext_presence=erp.accessibilite.stationnement_ext_presence,
@@ -234,6 +238,8 @@ def map_from(erp) -> "EtalabMapper":
234238
cheminement_ext_ascenseur_pmr=erp.accessibilite.cheminement_ext_ascenseur_pmr,
235239
entree_ascenseur_pmr=erp.accessibilite.entree_ascenseur_pmr,
236240
accueil_cheminement_ascenseur_pmr=erp.accessibilite.accueil_cheminement_ascenseur_pmr,
241+
accueil_urne_accessibilite=erp.accessibilite.accueil_urne_accessibilite,
242+
accueil_isoloir_accessibilite=erp.accessibilite.accueil_isoloir_accessibilite,
237243
)
238244

239245

erp/export/static/base-schema.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"keywords": ["accessibilite", "access", "a11y"],
77
"countryCode": "FR",
88
"homepage": "https://github.com/MTES-MCT/acceslibre-schema",
9-
"path": "https://github.com/MTES-MCT/acceslibre-schema/raw/v0.0.18/schema.json",
9+
"path": "https://github.com/MTES-MCT/acceslibre-schema/raw/v0.0.19/schema.json",
1010
"licenses": [
1111
{
1212
"title": "Etalab Licence Ouverte 2.0",
@@ -18,18 +18,18 @@
1818
{
1919
"title": "Fichier valide (CSV)",
2020
"name": "exemple-valide-csv",
21-
"path": "https://github.com/MTES-MCT/acceslibre-schema/raw/v0.0.18/exemple-valide.csv"
21+
"path": "https://github.com/MTES-MCT/acceslibre-schema/raw/v0.0.19/exemple-valide.csv"
2222
},
2323
{
2424
"title": "Schéma au format XLS",
2525
"name": "schema_format_xls",
26-
"path": "https://github.com/MTES-MCT/acceslibre-schema/blob/v0.0.18/schema_format_excel.xls"
26+
"path": "https://github.com/MTES-MCT/acceslibre-schema/blob/v0.0.19/schema_format_excel.xls"
2727
}
2828
],
2929
"sources": [],
3030
"created": "2021-03-10",
31-
"lastModified": "2025-09-25",
32-
"version": "0.0.18",
31+
"lastModified": "2025-12-23",
32+
"version": "0.0.19",
3333
"contributors": [
3434
{
3535
"title": "Christophe Vanfrackem",

erp/export/static/schema.json

Lines changed: 99 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@
182182
"Bureau de change",
183183
"Bureau de douane",
184184
"Bureau de poste",
185+
"Bureau de vote",
185186
"Café, bar, brasserie",
186187
"Caisse d'allocations familiales (caf)",
187188
"Camping caravaning",
@@ -543,6 +544,37 @@
543544
"NON"
544545
]
545546
},
547+
{
548+
"name": "transport_bureau_de_vote_accessibilite",
549+
"type": "boolean",
550+
"title": "Service municipal de transport adapté",
551+
"description": "Existe-t-il un service municipal de transport adapté entre le domicile et le bureau de vote ?",
552+
"example": "True",
553+
"trueValues": [
554+
"true",
555+
"True",
556+
"TRUE",
557+
"1",
558+
"vrai",
559+
"Vrai",
560+
"VRAI",
561+
"oui",
562+
"Oui",
563+
"OUI"
564+
],
565+
"falseValues": [
566+
"false",
567+
"False",
568+
"FALSE",
569+
"0",
570+
"faux",
571+
"Faux",
572+
"FAUX",
573+
"non",
574+
"Non",
575+
"NON"
576+
]
577+
},
546578
{
547579
"name": "stationnement_presence",
548580
"type": "boolean",
@@ -2183,6 +2215,68 @@
21832215
"NON"
21842216
]
21852217
},
2218+
{
2219+
"name": "accueil_isoloir_accessibilite",
2220+
"type": "boolean",
2221+
"title": "Isoloir",
2222+
"description": "Le bureau de vote est-il équipé d'un isoloir adapté (largeur mini : 1m et hauteur de la tablette entre 0,70 et 0,80m)",
2223+
"example": "True",
2224+
"trueValues": [
2225+
"true",
2226+
"True",
2227+
"TRUE",
2228+
"1",
2229+
"vrai",
2230+
"Vrai",
2231+
"VRAI",
2232+
"oui",
2233+
"Oui",
2234+
"OUI"
2235+
],
2236+
"falseValues": [
2237+
"false",
2238+
"False",
2239+
"FALSE",
2240+
"0",
2241+
"faux",
2242+
"Faux",
2243+
"FAUX",
2244+
"non",
2245+
"Non",
2246+
"NON"
2247+
]
2248+
},
2249+
{
2250+
"name": "accueil_urne_accessibilite",
2251+
"type": "boolean",
2252+
"title": "Urne",
2253+
"description": "La fente de l'urne est-elle située entre 0,90 et 1,30m de hauteur ?",
2254+
"example": "True",
2255+
"trueValues": [
2256+
"true",
2257+
"True",
2258+
"TRUE",
2259+
"1",
2260+
"vrai",
2261+
"Vrai",
2262+
"VRAI",
2263+
"oui",
2264+
"Oui",
2265+
"OUI"
2266+
],
2267+
"falseValues": [
2268+
"false",
2269+
"False",
2270+
"FALSE",
2271+
"0",
2272+
"faux",
2273+
"Faux",
2274+
"FAUX",
2275+
"non",
2276+
"Non",
2277+
"NON"
2278+
]
2279+
},
21862280
{
21872281
"name": "sanitaires_presence",
21882282
"type": "boolean",
@@ -2312,7 +2406,7 @@
23122406
"keywords": ["accessibilite", "access", "a11y"],
23132407
"countryCode": "FR",
23142408
"homepage": "https://github.com/MTES-MCT/acceslibre-schema",
2315-
"path": "https://github.com/MTES-MCT/acceslibre-schema/raw/v0.0.18/schema.json",
2409+
"path": "https://github.com/MTES-MCT/acceslibre-schema/raw/v0.0.19/schema.json",
23162410
"licenses": [
23172411
{
23182412
"title": "Etalab Licence Ouverte 2.0",
@@ -2324,18 +2418,18 @@
23242418
{
23252419
"title": "Fichier valide (CSV)",
23262420
"name": "exemple-valide-csv",
2327-
"path": "https://github.com/MTES-MCT/acceslibre-schema/raw/v0.0.18/exemple-valide.csv"
2421+
"path": "https://github.com/MTES-MCT/acceslibre-schema/raw/v0.0.19/exemple-valide.csv"
23282422
},
23292423
{
23302424
"title": "Schéma au format XLS",
23312425
"name": "schema_format_xls",
2332-
"path": "https://github.com/MTES-MCT/acceslibre-schema/blob/v0.0.18/schema_format_excel.xls"
2426+
"path": "https://github.com/MTES-MCT/acceslibre-schema/blob/v0.0.19/schema_format_excel.xls"
23332427
}
23342428
],
23352429
"sources": [],
23362430
"created": "2021-03-10",
2337-
"lastModified": "2025-09-25",
2338-
"version": "0.0.18",
2431+
"lastModified": "2025-12-23",
2432+
"version": "0.0.19",
23392433
"contributors": [
23402434
{
23412435
"title": "Christophe Vanfrackem",

erp/forms.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,15 +214,47 @@ def __init__(self, *args, **kwargs):
214214
self.fields.pop(field, None)
215215

216216

217+
class ContribAccessibilitePollingStationForm(ContribAccessibiliteForm):
218+
fields_to_remove = (
219+
"entree_dispositif_appel",
220+
"entree_balise_sonore",
221+
"entree_aide_humaine",
222+
"accueil_cheminement_plain_pied",
223+
"accueil_retrecissement",
224+
"accueil_personnels",
225+
"accueil_audiodescription_presence",
226+
"accueil_equipements_malentendants_presence",
227+
"labels",
228+
"labels_familles_handicap",
229+
"labels_autre",
230+
)
231+
conditionals_to_add = get_conditional_fields_in("polling_station")
232+
conditionals_to_remove = get_conditional_fields_not_in("polling_station")
233+
234+
class Meta:
235+
model = Accessibilite
236+
exclude = ("pk",)
237+
widgets = get_widgets_for_accessibilite()
238+
labels = schema.get_labels(include_conditional=["polling_station"])
239+
help_texts = schema.get_help_texts(include_conditional=["polling_station"])
240+
required = schema.get_required_fields()
241+
242+
def __init__(self, *args, **kwargs):
243+
super().__init__(*args, **kwargs)
244+
for field in copy(self.fields):
245+
if field not in schema.get_help_texts(include_conditional="polling_station").keys():
246+
self.fields.pop(field, None)
247+
248+
217249
class AdminAccessibiliteForm(ContribAccessibiliteForm):
218250
# Note: defining `labels` and `help_texts` in `Meta` doesn't work with custom
219251
# fields, hence why we set them up manually for each fields.
220252
class Meta:
221253
model = Accessibilite
222254
exclude = ["pk"]
223255
widgets = get_widgets_for_accessibilite()
224-
labels = schema.get_labels(include_conditional=["hosting", "school", "floor"])
225-
help_texts = schema.get_help_texts(include_conditional=["hosting", "school", "floor"])
256+
labels = schema.get_labels(include_conditional=["hosting", "school", "floor", "polling_station"])
257+
help_texts = schema.get_help_texts(include_conditional=["hosting", "school", "floor", "polling_station"])
226258
required = schema.get_required_fields()
227259

228260
sanitaires_adaptes = forms.ChoiceField(
@@ -775,6 +807,7 @@ def get_contrib_forms_for_activity(activity: Activite):
775807
ACTIVITY_GROUPS["HOSTING"]: ContribAccessibiliteHotelsForm,
776808
ACTIVITY_GROUPS["SCHOOL"]: ContribAccessibiliteSchoolsForm,
777809
ACTIVITY_GROUPS["FLOOR"]: ContribAccessibiliteFloorsForm,
810+
ACTIVITY_GROUPS["POLLING_STATION"]: ContribAccessibilitePollingStationForm,
778811
}
779812

780813
groups = activity.groups.all()

erp/management/commands/generate_schema.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def add_arguments(self, parser):
2222
def handle(self, *args, **options):
2323
base = options.get("base-file", self.default_dir + "/base-schema.json")
2424
outfile = options.get("out-file", self.default_dir + "/schema.json")
25-
repository = "https://github.com/MTES-MCT/acceslibre-schema/raw/v0.0.18/"
25+
repository = "https://github.com/MTES-MCT/acceslibre-schema/raw/v0.0.19/"
2626
try:
2727
generate_schema(base=base, outfile=outfile, repository=repository)
2828
print(f"Schema generated to: {outfile}")
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Generated by Django 5.2.8 on 2025-12-22 13:25
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("erp", "0181_elevator_accessibility"),
9+
]
10+
11+
operations = [
12+
migrations.AddField(
13+
model_name="accessibilite",
14+
name="accueil_isoloir_accessibilite",
15+
field=models.BooleanField(
16+
blank=True,
17+
choices=[(True, "Oui"), (False, "Non"), (None, "Inconnu")],
18+
null=True,
19+
verbose_name="Accessibilité de l'isoloir",
20+
),
21+
),
22+
migrations.AddField(
23+
model_name="accessibilite",
24+
name="accueil_urne_accessibilite",
25+
field=models.BooleanField(
26+
blank=True,
27+
choices=[(True, "Oui"), (False, "Non"), (None, "Inconnu")],
28+
null=True,
29+
verbose_name="Accessibilité de l'urne",
30+
),
31+
),
32+
migrations.AddField(
33+
model_name="accessibilite",
34+
name="transport_bureau_de_vote_accessibilite",
35+
field=models.BooleanField(
36+
blank=True,
37+
choices=[(True, "Oui"), (False, "Non"), (None, "Inconnu")],
38+
null=True,
39+
verbose_name="Accessibilité du service municipal de transport",
40+
),
41+
),
42+
]

0 commit comments

Comments
 (0)