Skip to content

Commit 82ccc24

Browse files
committed
Changed election parameters from a list to a dedicated dataclass, reflected changes across urls.py
1 parent 50302b1 commit 82ccc24

File tree

2 files changed

+56
-40
lines changed

2 files changed

+56
-40
lines changed

src/elections/crud.py

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import dataclasses
21
import logging
2+
from dataclasses import dataclass
33
from datetime import datetime
44

55
import sqlalchemy
@@ -9,6 +9,21 @@
99
from officers.constants import OfficerPosition
1010
from officers.tables import OfficerInfo, OfficerTerm
1111

12+
13+
@dataclass
14+
class ElectionParameters:
15+
"""
16+
Dataclass encompassing the data that can go into an Election.
17+
"""
18+
slug: str
19+
name: str
20+
officer_id: str
21+
type: str
22+
date: datetime
23+
end_date: datetime
24+
survey_link: str
25+
26+
1227
_logger = logging.getLogger(__name__)
1328

1429
async def get_election(db_session: database.DBSession, election_slug: str) -> Election | None:
@@ -20,18 +35,18 @@ async def get_election(db_session: database.DBSession, election_slug: str) -> El
2035
result = await db_session.scalar(query)
2136
return result
2237

23-
async def create_election(params: dict[str, datetime], db_session: database.DBSession) -> None:
38+
async def create_election(params: ElectionParameters, db_session: database.DBSession) -> None:
2439
"""
2540
Creates a new election with given parameters.
2641
Does not validate if an election _already_ exists
2742
"""
28-
election = Election(slug=params["slug"],
29-
name=params["name"],
30-
officer_id=params["officer_id"],
31-
type=params["type"],
32-
date=params["date"],
33-
end_date=params["end_date"],
34-
websurvey=params["websurvey"])
43+
election = Election(slug=params.slug,
44+
name=params.name,
45+
officer_id=params.officer_id,
46+
type=params.type,
47+
date=params.date,
48+
end_date=params.end_date,
49+
survey_link=params.survey_link)
3550
db_session.add(election)
3651

3752
async def delete_election(slug: str, db_session: database.DBSession) -> None:
@@ -42,25 +57,25 @@ async def delete_election(slug: str, db_session: database.DBSession) -> None:
4257
query = sqlalchemy.delete(Election).where(Election.slug == slug)
4358
await db_session.execute(query)
4459

45-
async def update_election(params: dict[str, datetime], db_session: database.DBSession) -> None:
60+
async def update_election(params: ElectionParameters, db_session: database.DBSession) -> None:
4661
"""
4762
Updates an election with the provided parameters.
4863
Take care as this will replace values with None if not populated.
4964
You _cannot_ change the name or slug, you should instead delete and create a new election.
5065
Does not validate if an election _already_ exists
5166
"""
5267

53-
election = (await db_session.execute(sqlalchemy.select(Election).filter_by(slug=params["slug"]))).scalar_one()
68+
election = (await db_session.execute(sqlalchemy.select(Election).filter_by(slug=params.slug))).scalar_one()
5469

55-
if params["date"] is not None:
56-
election.date = params["date"]
57-
if params["type"] is not None:
58-
election.type = params["type"]
59-
if params["end_date"] is not None:
60-
election.end_date = params["end_date"]
61-
if params["websurvey"] is not None:
62-
election.websurvey = params["websurvey"]
70+
if params.date is not None:
71+
election.date = params.date
72+
if params.type is not None:
73+
election.type = params.type
74+
if params.end_date is not None:
75+
election.end_date = params.end_date
76+
if params.survey_link is not None:
77+
election.survey_link = params.survey_link
6378

64-
query = sqlalchemy.update(Election).where(Election.slug == params["slug"]).values(election)
79+
query = sqlalchemy.update(Election).where(Election.slug == params.slug).values(election)
6580
await db_session.execute(query)
6681

src/elections/urls.py

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import requests # TODO: make this async
99
import xmltodict
10+
from crud import ElectionParameters
1011
from fastapi import APIRouter, BackgroundTasks, FastAPI, HTTPException, Request, status
1112
from fastapi.exceptions import RequestValidationError
1213
from tables import election_types
@@ -53,7 +54,7 @@ async def create_election(
5354
election_type: str,
5455
date: datetime | None = None,
5556
end_date: datetime | None = None,
56-
websurvey: str | None = None
57+
survey_link: str | None = None
5758
):
5859
"""
5960
aaa
@@ -75,15 +76,15 @@ async def create_election(
7576
if election_type not in election_types:
7677
raise RequestValidationError()
7778

78-
params = {
79-
"slug" : _slugify(name),
80-
"name": name,
81-
"officer_id" : await auth.crud.get_computing_id(db_session, session_id),
82-
"type": election_type,
83-
"date": date,
84-
"end_date": end_date,
85-
"websurvey": websurvey
86-
}
79+
params = ElectionParameters(
80+
_slugify(name),
81+
name,
82+
await auth.crud.get_computing_id(db_session, session_id),
83+
election_type,
84+
date,
85+
end_date,
86+
survey_link
87+
)
8788

8889
await elections.crud.create_election(params, db_session)
8990
await db_session.commit()
@@ -127,7 +128,7 @@ async def update_election(
127128
election_type: str,
128129
date: datetime | None = None,
129130
end_date: datetime | None = None,
130-
websurvey: str | None = None
131+
survey_link: str | None = None
131132
):
132133
session_id = request.cookies.get("session_id", None)
133134
user_auth = await _validate_user(db_session, session_id)
@@ -139,15 +140,15 @@ async def update_election(
139140
headers={"WWW-Authenticate": "Basic"},
140141
)
141142
if slug is not None:
142-
params = {
143-
"slug" : slug,
144-
"name" : name,
145-
"officer_id" : await auth.crud.get_computing_id(db_session, session_id),
146-
"type": election_type,
147-
"date": date,
148-
"end_date": end_date,
149-
"websurvey": websurvey
150-
}
143+
params = ElectionParameters(
144+
_slugify(name),
145+
name,
146+
await auth.crud.get_computing_id(db_session, session_id),
147+
election_type,
148+
date,
149+
end_date,
150+
survey_link
151+
)
151152
await elections.crud.update_election(params, db_session)
152153
await db_session.commit()
153154

0 commit comments

Comments
 (0)