diff --git a/nupes/scripts/import_resultats_2024.py b/nupes/scripts/import_resultats_2024.py index a03000a..0a24685 100644 --- a/nupes/scripts/import_resultats_2024.py +++ b/nupes/scripts/import_resultats_2024.py @@ -6,8 +6,9 @@ from tqdm import tqdm from nupes.cache import get_file from nupes.models import BureauVote, Departement -from nupes.models.europeennes2024 import ResultatsBureauVote, Liste, VoixListeBureauVote, ResultatsCommune, \ - ResultatsDepartement, ResultatsRegion, ResultatsFrance +from nupes.models.europeennes2024 import ResultatsBureauVote, Liste, ResultatsCommune, \ + ResultatsDepartement, ResultatsRegion, ResultatsFrance, \ + VoixListeBureauVote, VoixListeCommune, VoixListeDepartement, VoixListeRegion, VoixListeFrance def importer_resultats_bv(engine: Engine, verbose: bool = False) -> None: @@ -87,11 +88,39 @@ def importer_resultats_bv(engine: Engine, verbose: bool = False) -> None: voix_liste_bv.voix = int(row[f"Voix {liste.id}"]) - session.commit() + session.commit() def calculer_resultats_commune(engine: Engine, verbose: bool = False) -> None: - pass + with Session(engine) as session: + for resultat_commune in tqdm(session.execute(select(ResultatsCommune)).scalars(), desc="Communes", + disable=not verbose): + resultats_bv = session.execute(select(ResultatsBureauVote) + .filter_by(resultats_commune_id=resultat_commune.id)).scalars().all() + resultat_commune.inscrits = sum(r.inscrits for r in resultats_bv) + resultat_commune.votants = sum(r.votants for r in resultats_bv) + resultat_commune.abstentions = sum(r.abstentions for r in resultats_bv) + resultat_commune.exprimes = sum(r.exprimes for r in resultats_bv) + resultat_commune.blancs = sum(r.blancs for r in resultats_bv) + resultat_commune.nuls = sum(r.nuls for r in resultats_bv) + + for liste in session.execute(select(Liste)).scalars().all(): + voix_liste = session.execute(select(VoixListeBureauVote).filter_by(liste_id=liste.id) + .join(ResultatsBureauVote) + .filter_by(resultats_commune_id=resultat_commune.id)) \ + .scalars().all() + voix = sum(v.voix for v in voix_liste) + if voix_liste_commune := session.execute( + select(VoixListeCommune).filter_by(resultats_commune_id=resultat_commune.id, + liste_id=liste.id)).scalar_one_or_none(): + voix_liste_commune.voix = voix + else: + voix_liste_commune = VoixListeCommune(resultats_commune_id=resultat_commune.id, + liste_id=liste.id, + voix=voix) + session.add(voix_liste_commune) + + session.commit() def calculer_resultats_circo(engine: Engine, verbose: bool = False) -> None: @@ -99,15 +128,97 @@ def calculer_resultats_circo(engine: Engine, verbose: bool = False) -> None: def calculer_resultats_departement(engine: Engine, verbose: bool = False) -> None: - pass + with Session(engine) as session: + for resultat_dpt in tqdm(session.execute(select(ResultatsDepartement)).scalars(), desc="Départements", + disable=not verbose): + resultats_commune = session.execute(select(ResultatsCommune) + .filter_by(resultats_dpt_id=resultat_dpt.id)).scalars().all() + resultat_dpt.inscrits = sum(r.inscrits for r in resultats_commune) + resultat_dpt.votants = sum(r.votants for r in resultats_commune) + resultat_dpt.abstentions = sum(r.abstentions for r in resultats_commune) + resultat_dpt.exprimes = sum(r.exprimes for r in resultats_commune) + resultat_dpt.blancs = sum(r.blancs for r in resultats_commune) + resultat_dpt.nuls = sum(r.nuls for r in resultats_commune) + + for liste in session.execute(select(Liste)).scalars().all(): + voix_liste = session.execute(select(VoixListeCommune).filter_by(liste_id=liste.id) + .join(ResultatsCommune) + .filter_by(resultats_dpt_id=resultat_dpt.id)) \ + .scalars().all() + voix = sum(v.voix for v in voix_liste) + if voix_liste_dpt := session.execute(select(VoixListeDepartement) + .filter_by(resultats_departement_id=resultat_dpt.id, + liste_id=liste.id)) \ + .scalar_one_or_none(): + voix_liste_dpt.voix = voix + else: + voix_liste_dpt = VoixListeDepartement(resultats_departement_id=resultat_dpt.id, + liste_id=liste.id, + voix=voix) + session.add(voix_liste_dpt) + + session.commit() def calculer_resultats_region(engine: Engine, verbose: bool = False) -> None: - pass + with Session(engine) as session: + for resultat_reg in tqdm(session.execute(select(ResultatsRegion)).scalars(), desc="Régions", + disable=not verbose): + resultats_dpt = session.execute(select(ResultatsDepartement) + .filter_by(resultats_region_id=resultat_reg.id)).scalars().all() + resultat_reg.inscrits = sum(r.inscrits for r in resultats_dpt) + resultat_reg.votants = sum(r.votants for r in resultats_dpt) + resultat_reg.abstentions = sum(r.abstentions for r in resultats_dpt) + resultat_reg.exprimes = sum(r.exprimes for r in resultats_dpt) + resultat_reg.blancs = sum(r.blancs for r in resultats_dpt) + resultat_reg.nuls = sum(r.nuls for r in resultats_dpt) + + for liste in session.execute(select(Liste)).scalars().all(): + voix_liste = session.execute(select(VoixListeDepartement).filter_by(liste_id=liste.id) + .join(ResultatsDepartement) + .filter_by(resultats_region_id=resultat_reg.id)) \ + .scalars().all() + voix = sum(v.voix for v in voix_liste) + if voix_liste_reg := session.execute(select(VoixListeRegion) + .filter_by(resultats_region_id=resultat_reg.id, + liste_id=liste.id)).scalar_one_or_none(): + voix_liste_reg.voix = voix + else: + voix_liste_reg = VoixListeRegion(resultats_region_id=resultat_reg.id, + liste_id=liste.id, + voix=voix) + session.add(voix_liste_reg) + + session.commit() def calculer_resultats_national(engine: Engine, verbose: bool = False) -> None: - pass + with Session(engine) as session: + resultat_france = session.execute(select(ResultatsFrance)).scalar_one() + resultats_reg = session.execute(select(ResultatsRegion)).scalars().all() + resultat_france.inscrits = sum(r.inscrits for r in resultats_reg) + resultat_france.votants = sum(r.votants for r in resultats_reg) + resultat_france.abstentions = sum(r.abstentions for r in resultats_reg) + resultat_france.exprimes = sum(r.exprimes for r in resultats_reg) + resultat_france.blancs = sum(r.blancs for r in resultats_reg) + resultat_france.nuls = sum(r.nuls for r in resultats_reg) + + for liste in session.execute(select(Liste)).scalars().all(): + voix_liste = session.execute(select(VoixListeRegion).filter_by(liste_id=liste.id).join(ResultatsRegion) + .filter_by(resultats_france_id=resultat_france.id)) \ + .scalars().all() + voix = sum(v.voix for v in voix_liste) + if voix_liste_france := session.execute(select(VoixListeFrance) + .filter_by(resultats_france_id=resultat_france.id, + liste_id=liste.id)).scalar_one_or_none(): + voix_liste_france.voix = voix + else: + voix_liste_france = VoixListeFrance(resultats_france_id=resultat_france.id, + liste_id=liste.id, + voix=voix) + session.add(voix_liste_france) + + session.commit() def run(engine: Engine, verbose: bool = False) -> None: