Comparing sensitive data, confidential files or internal emails?

Most legal and privacy policies prohibit uploading sensitive data online. Diffchecker Desktop ensures your confidential information never leaves your computer. Work offline and compare documents securely.

app-separating-code-to-models

Created Diff never expires
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()