app-separating-code-to-models
45 removals
102 lines
43 additions
101 lines
import os
import random
import psycopg2
import psycopg2
from psycopg2.errors import DivisionByZero
from dotenv import load_dotenv
import database
import database
from connection_pool import pool
from models.option import Option
from models.poll import Poll
DATABASE_PROMPT = "Enter the DATABASE_URI value or leave empty to load from .env file: "
MENU_PROMPT = """-- Menu --
MENU_PROMPT = """-- Menu --
1) Create new poll
1) Create new poll
2) List open polls
2) List open polls
3) Vote on a poll
3) Vote on a poll
4) Show poll votes
4) Show poll votes
5) Select a random winner from a poll option
5) Select a random winner from a poll option
6) Exit
6) Exit
Enter your choice: """
Enter your choice: """
NEW_OPTION_PROMPT = "Enter new option text (or leave empty to stop adding options): "
NEW_OPTION_PROMPT = "Enter new option text (or leave empty to stop adding options): "
def prompt_create_poll(connection):
def prompt_create_poll():
poll_title = input("Enter poll title: ")
title = input("Enter poll title: ")
poll_owner = input("Enter poll owner: ")
owner = input("Enter poll owner: ")
options = []
poll = Poll(title, owner)
poll.save()
while (new_option := input(NEW_OPTION_PROMPT)):
while (new_option := input(NEW_OPTION_PROMPT)):
options.append(new_option)
poll.add_option(new_option)
database.create_poll(connection, poll_title, poll_owner, options)
def list_open_polls(connection):
def list_open_polls():
polls = database.get_polls(connection)
for poll in Poll.all():
print(f"{poll.id}: {poll.title} (created by {poll.owner})")
for poll in polls:
print(f"{poll[0]}: {poll[1]} (created by {poll[2]})")
def prompt_vote_poll(connection):
def prompt_vote_poll():
poll_id = int(input("Enter poll would you like to vote on: "))
poll_id = int(input("Enter poll would you like to vote on: "))
poll_options = database.get_poll_details(connection, poll_id)
_print_poll_options(Poll.get(poll_id).options)
_print_poll_options(poll_options)
option_id = int(input("Enter option you'd like to vote for: "))
option_id = int(input("Enter option you'd like to vote for: "))
username = input("Enter the username you'd like to vote as: ")
username = input("Enter the username you'd like to vote as: ")
database.add_poll_vote(connection, username, option_id)
Option.get(option_id).vote(username)
def _print_poll_options(poll_with_options):
def _print_poll_options(options):
for option in poll_with_options:
for option in options:
print(f"{option[3]}: {option[4]}")
print(f"{option.id}: {option.text}")
def show_poll_votes(connection):
def show_poll_votes():
poll_id = int(input("Enter poll you would like to see votes for: "))
poll_id = int(input("Enter poll you would like to see votes for: "))
poll = Poll.get(poll_id)
options = poll.options
votes_per_option = [len(option.votes) for option in options]
total_votes = sum(votes_per_option)
try:
try:
poll_and_votes = database.get_poll_and_vote_results(connection, poll_id)
for option, votes in zip(options, votes_per_option):
except DivisionByZero:
percentage = votes / total_votes * 100
percentage = votes / total_votes * 100
print(f"{option.text} for {votes} ({percentage:.2f}% of total)")
except ZeroDivisionError:
print("No votes yet cast for this poll.")
print("No votes yet cast for this poll.")
else:
for result in poll_and_votes:
print(f"{result[1]} got {result[2]} votes ({result[3]:.2f}% of total)")
def randomize_poll_winner(connection):
def randomize_poll_winner():
poll_id = int(input("Enter poll you'd like to pick a winner for: "))
poll_id = int(input("Enter poll you'd like to pick a winner for: "))
poll_options = database.get_poll_details(connection, poll_id)
poll = Poll.get(poll_id)
_print_poll_options(poll_options)
_print_poll_options(poll.options)
option_id = int(input("Enter which is the winning option, we'll pick a random winner from voters: "))
option_id = int(input("Enter which is the winning option, we'll pick a random winner from voters: "))
winner = database.get_random_poll_vote(connection, option_id)
votes = Option.get(option_id).votes
winner = random.choice(votes)
print(f"The randomly selected winner is {winner[0]}.")
print(f"The randomly selected winner is {winner[0]}.")
MENU_OPTIONS = {
MENU_OPTIONS = {
"1": prompt_create_poll,
"1": prompt_create_poll,
"2": list_open_polls,
"2": list_open_polls,
"3": prompt_vote_poll,
"3": prompt_vote_poll,
"4": show_poll_votes,
"4": show_poll_votes,
"5": randomize_poll_winner
"5": randomize_poll_winner
}
}
def menu():
def menu():
database_uri = input(DATABASE_PROMPT)
connection = pool.getconn()
if not database_uri:
load_dotenv()
database_uri = os.environ["DATABASE_URI"]
connection = psycopg2.connect(database_uri)
database.create_tables(connection)
database.create_tables(connection)
pool.putconn(connection)
while (selection := input(MENU_PROMPT)) != "6":
while (selection := input(MENU_PROMPT)) != "6":
try:
try:
MENU_OPTIONS[selection](connection)
MENU_OPTIONS[selection]()
except KeyError:
except KeyError:
print("Invalid input selected. Please try again.")
print("Invalid input selected. Please try again.")
menu()
menu()