From f68efefa571286929c02cc53a7c57e27484cfa25 Mon Sep 17 00:00:00 2001 From: Pierre-Louis Guhur Date: Wed, 18 Jan 2023 06:07:52 +0000 Subject: [PATCH] fix: ranking bug --- app/crud.py | 15 +++++++++--- docker-compose.yml | 61 +++++++++++++++++++--------------------------- 2 files changed, 36 insertions(+), 40 deletions(-) diff --git a/app/crud.py b/app/crud.py index 98d7eda..d82662a 100644 --- a/app/crud.py +++ b/app/crud.py @@ -5,7 +5,7 @@ from collections import defaultdict import typing as t from sqlalchemy.orm import Session from sqlalchemy import func, insert -from majority_judgment import majority_judgment +from majority_judgment import majority_judgment, Candidate, Vote from . import models, schemas, errors from .settings import settings from .auth import create_ballot_token, create_admin_token, jws_verify @@ -463,14 +463,21 @@ def get_results(db: Session, election_ref: str) -> schemas.ResultsGet: for candidate_id, grade_value, num_votes in db_res: ballots[candidate_id][grade_value] = num_votes - merit_profile = { + merit_profile2 = { c: {value: votes[value] for value in sorted(votes.keys(), reverse=True)} for c, votes in ballots.items() } - ranking = majority_judgment(merit_profile) # pyright: ignore + merit_profile: dict[Candidate, list[Vote]] = { + c: sorted(sum([ + [value] * votes[value] + for value in sorted(votes.keys(), reverse=True)], [])) + for c, votes in ballots.items() + } + + ranking = majority_judgment(merit_profile, reverse=True) # pyright: ignore db_election.ranking = ranking - db_election.merit_profile = merit_profile + db_election.merit_profile = merit_profile2 results = schemas.ResultsGet.from_orm(db_election) diff --git a/docker-compose.yml b/docker-compose.yml index 0266d41..d340ec2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -151,54 +151,43 @@ services: - "traefik.http.routers.metabase.tls=true" - "traefik.http.routers.metabase.tls.certresolver=leresolver" - mj_admin: - image: fastapi-admin - container_name: fastapi-admin - build: - context: ./docker/fastapi-admin - dockerfile: Dockerfile + mj_pgadmin: + image: dpage/pgadmin4 + environment: + PGADMIN_DEFAULT_EMAIL: ${EMAIL:-pgadmin4@pgadmin.org} + PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-admin} + PGADMIN_CONFIG_SERVER_MODE: 'False' restart: unless-stopped profiles: - admin - all - environment: - - TZ=${TIMEZONE:-Europe/Paris} - - DATABASE_URL=postgres://${DB_USER:-mj}:${DB_PASS}@mj_db:5432/fastapi-admin - - REDIS_URL=redis://mj_redis:6379/0 - command: uvicorn examples.main:app_ --port 8000 --host 0.0.0.0 - labels: - - "traefik.enable=true" - - "traefik.docker.network=traefik_network" - - "traefik.http.routers.fastapi_admin.entrypoints=web,websecure" - - "traefik.http.routers.fastapi_admin.rule=Host(`${FASTAPI_ADMIN_PREFIX:-fastapi}.${DOMAIN}`)" - - "traefik.http.services.fastapi_admin.loadbalancer.server.port=8000" - - "traefik.http.routers.fastapi_admin.tls=true" - - "traefik.http.routers.fastapi_admin.tls.certresolver=leresolver" + healthcheck: + test: ["CMD", "wget", "-q", "-O", "-", "http://localhost:5050"] + interval: 1m30s + timeout: 10s + retries: 3 + volumes: + - pgadmin:/var/lib/pgadmin + ports: + - "${PGADMIN_PORT:-5050}:80" networks: - lan - traefik_network - - mj_redis: - image: docker.io/bitnami/redis:7.0 - hostname: mj_redis - profiles: - - admin - - all - networks: - - lan - environment: - # ALLOW_EMPTY_PASSWORD is recommended only for development. - - ALLOW_EMPTY_PASSWORD=false - - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL - # ports: - # - '6379:6379' - volumes: - - 'redis_data:/bitnami/redis/data' + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.docker.network=traefik_network" + - "traefik.http.routers.pgadmin.entrypoints=web,websecure" + - "traefik.http.routers.pgadmin.rule=Host(`${PGADMIN:-pgadmin}.${DOMAIN}`)" + - "traefik.http.services.pgadmin.loadbalancer.server.port=80" + - "traefik.http.routers.pgadmin.tls=true" + - "traefik.http.routers.pgadmin.tls.certresolver=leresolver" volumes: imgpush: db: + pgadmin: redis_data: driver: local