1- import dataclasses
21import logging
2+ from dataclasses import dataclass
33from datetime import datetime
44
55import sqlalchemy
99from officers .constants import OfficerPosition
1010from 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
1429async 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
3752async 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
0 commit comments