This is an automated email from the ASF dual-hosted git repository. gstein pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/steve.git
commit 2d8ae1cbe7d1dacbc126390c07443f9a5e7eb98c Author: Greg Stein <[email protected]> AuthorDate: Fri Feb 20 00:26:08 2026 -0600 feat: add endpoints for setting election open and close dates --- v3/server/pages.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/v3/server/pages.py b/v3/server/pages.py index 46942f9..437bbbc 100644 --- a/v3/server/pages.py +++ b/v3/server/pages.py @@ -313,6 +313,59 @@ async def manage_stv_page(election, issue): return result [email protected]('/do-set-open_at/<eid>') [email protected]({R.committer}) +@load_election +async def do_set_open_at_endpoint(election): + result = await basic_info() + + ### check authz + + data = await quart.request.get_json() + date_str = data.get('date') + if not date_str: + quart.abort(400, 'Missing date') + + # Validate date (basic check) + try: + dt = datetime.datetime.fromisoformat(date_str).date() + except ValueError: + quart.abort(400, 'Invalid date format') + + # Record the opening date. + election.set_open_at(dt) + + _LOGGER.info(f'User[U:{result.uid}] set open_at for election[E:{election.eid}] to {date_str}') + return '', 204 + + [email protected]('/do-set-close_at/<eid>') [email protected]({R.committer}) +@load_election +async def do_set_close_at_endpoint(election): + # Similar to above, but for close_at + result = await basic_info() + + ### check authz + + data = await quart.request.get_json() + date_str = data.get('date') + if not date_str: + quart.abort(400, 'Missing date') + + # Validate date (basic check) + try: + dt = datetime.datetime.fromisoformat(date_str).date() + except ValueError: + quart.abort(400, 'Invalid date format') + + # Record the closing date. + election.set_close_at(dt) + + _LOGGER.info(f'User[U:{result.uid}] set close_at for election[E:{election.eid}] to {date_str}') + return '', 204 + + @APP.post('/do-create-election') @asfquart.auth.require({R.pmc_member}) ### need general solution async def do_create_endpoint():
