Adds init menu & saved substitutes list #5

This commit is contained in:
Fred Z 2018-08-08 17:53:11 +02:00
parent f77c7ad09d
commit 47bf7a6146
2 changed files with 158 additions and 102 deletions

226
cli.py
View File

@ -18,12 +18,14 @@ from db import Db
from config import DB_REQUEST, CLI_MSG_DISCLAIMER, CLI_MSG_ASK_IDX, \ from config import DB_REQUEST, CLI_MSG_DISCLAIMER, CLI_MSG_ASK_IDX, \
CLI_MSG_ASK_ERR, CLI_MSG_QUIT, CLI_MSG_CHOOSEN_CAT, CLI_MSG_PROD, \ CLI_MSG_ASK_ERR, CLI_MSG_QUIT, CLI_MSG_CHOOSEN_CAT, CLI_MSG_PROD, \
CLI_MSG_SUBST, CLI_MSG_NO_SUBST, CLI_MSG_CAT, CLI_MSG_CHOOSEN_PROD, \ CLI_MSG_SUBST, CLI_MSG_NO_SUBST, CLI_MSG_CAT, CLI_MSG_CHOOSEN_PROD, \
CLI_MSG_DETAILLED_SUB, CLI_MSG_CHOOSEN_SUBST, CLI_ITEM_MAX_LEN, \ CLI_MSG_DETAILLED_SUB, CLI_MAX_LEN, \
CLI_ITEM_LIST, CLI_MSG_ASK_BAK, CLI_MSG_BAK_DONE CLI_ITEM_LIST, CLI_MSG_ASK_BAK, CLI_MSG_BAK_DONE, CLI_MSG_INIT_MENU,\
cli_end_msg = str() CLI_MSG_SUBST_HEAD, CLI_MSG_SUBST_TITLE, CLI_MSG_SUBST_LIST
product_asked = {'valid_item': False} product_asked = {'valid_item': False}
cli_end_msg = CLI_MSG_QUIT cli_end_msg = CLI_MSG_QUIT
def ask_user(head_msg, item_list): def ask_user(head_msg, item_list):
""" """
Ask user to choose an item in the provided list, using numeric index Ask user to choose an item in the provided list, using numeric index
@ -98,12 +100,12 @@ def get_data_list(db_obj, sql):
# Hacky results-split for rendering in 2 columns # Hacky results-split for rendering in 2 columns
res_even = [( res_even = [(
idx, idx,
val['name'][:CLI_ITEM_MAX_LEN].ljust(CLI_ITEM_MAX_LEN), val['name'][:CLI_MAX_LEN].ljust(CLI_MAX_LEN),
val['option'], val['id'] val['option'], val['id']
) for idx, val in enumerate(db_obj.result) if idx % 2 == 0] ) for idx, val in enumerate(db_obj.result) if idx % 2 == 0]
res_uneven = [( res_uneven = [(
idx, idx,
val['name'][:CLI_ITEM_MAX_LEN], val['name'][:CLI_MAX_LEN],
val['option'], val['option'],
val['id'] val['id']
) for idx, val in enumerate(db_obj.result) if idx % 2 != 0] ) for idx, val in enumerate(db_obj.result) if idx % 2 != 0]
@ -131,113 +133,159 @@ def get_data_list(db_obj, sql):
} }
def start_init_menu():
""" Ask for saved substitution or searching new one """
LOCAL_DB.execute(DB_REQUEST['list_substituated_prod'])
if LOCAL_DB.cursor.rowcount > 0:
menu_list = {
'results_txt': CLI_MSG_INIT_MENU,
'results_list': [False, True],
'max_id': 1
}
# Ask for saved list or search new one
menu_asked = ask_user(
CLI_MSG_DISCLAIMER,
menu_list
)
# Shows saved list
if menu_asked['valid_item'] and menu_asked['item']:
cli_msg_subst_recap = CLI_MSG_SUBST_TITLE + CLI_MSG_SUBST_HEAD
for row in LOCAL_DB.result:
cli_msg_subst_recap += CLI_MSG_SUBST_LIST.format(
pname=row['pname'][:CLI_MAX_LEN].center(CLI_MAX_LEN),
sname=row['sname'][:CLI_MAX_LEN].center(CLI_MAX_LEN),
)
return (True, cli_msg_subst_recap)
return (False, "")
return (False, "Pas de substitutions enregistée")
# Starts a DB connection # Starts a DB connection
LOCAL_DB = Db() LOCAL_DB = Db()
################
# INITIAL MENU #
################
init_menu = start_init_menu()
#############################
# LISTS SAVED SUBSTITUTIONS #
#############################
if init_menu[0]:
cli_end_msg = init_menu[1]
#################### ####################
# LISTS CATEGORIES # # LISTS CATEGORIES #
#################### ####################
category_list = get_data_list( else:
LOCAL_DB, category_list = get_data_list(
DB_REQUEST['list_cat']
)
head_msg = CLI_MSG_DISCLAIMER
head_msg += CLI_MSG_CAT
# Asks the user to select a category
category_asked = ask_user(
head_msg,
category_list
)
##################
# LISTS PRODUCTS #
##################
if category_asked['valid_item']:
product_list = get_data_list(
LOCAL_DB, DB_REQUEST['list_prod'].format(category_asked['item'][3])
)
head_msg = CLI_MSG_DISCLAIMER
head_msg += CLI_MSG_CHOOSEN_CAT.format(category_asked['item'][1])
head_msg += CLI_MSG_PROD
# Asks the user to select a product
product_asked = ask_user(
head_msg,
product_list
)
####################
# LISTS SUBTITUTES #
####################
if product_asked['valid_item']:
substitute_list = get_data_list(
LOCAL_DB, LOCAL_DB,
DB_REQUEST['list_substitute'].format( DB_REQUEST['list_cat']
category_asked['item'][3],
product_asked['item'][2]
)
) )
head_msg = CLI_MSG_DISCLAIMER head_msg = CLI_MSG_DISCLAIMER
head_msg += CLI_MSG_CHOOSEN_CAT.format(category_asked['item'][1]) head_msg += init_menu[1]
head_msg += CLI_MSG_CHOOSEN_PROD.format(product_asked['item'][1]) head_msg += CLI_MSG_CAT
head_msg += CLI_MSG_SUBST
# No substitute found # Asks the user to select a category
if substitute_list['max_id'] == -1: category_asked = ask_user(
cli_end_msg = CLI_MSG_NO_SUBST.format( head_msg,
product_asked['item'][1], category_list
product_asked['item'][2] )
##################
# LISTS PRODUCTS #
##################
if category_asked['valid_item']:
product_list = get_data_list(
LOCAL_DB,
DB_REQUEST['list_prod'].format(category_asked['item'][3])
) )
# Asks the user to select a substitute head_msg = CLI_MSG_DISCLAIMER
elif substitute_list['max_id'] > 0: head_msg += CLI_MSG_CHOOSEN_CAT.format(category_asked['item'][1])
substit_asked = ask_user( head_msg += CLI_MSG_PROD
# Asks the user to select a product
product_asked = ask_user(
head_msg, head_msg,
substitute_list product_list
) )
########################## ####################
# SHOW SUBTITUTE DETAILS # # LISTS SUBTITUTES #
########################## ####################
if substit_asked['valid_item']: if product_asked['valid_item']:
LOCAL_DB.execute(DB_REQUEST['select_substitute'].format( substitute_list = get_data_list(
substit_asked['item'][3] LOCAL_DB,
)) DB_REQUEST['list_substitute'].format(
category_asked['item'][3],
product_asked['item'][2]
)
)
head_msg = CLI_MSG_DISCLAIMER +\ head_msg = CLI_MSG_DISCLAIMER
CLI_MSG_CHOOSEN_CAT.format(category_asked['item'][1]) +\ head_msg += CLI_MSG_CHOOSEN_CAT.format(category_asked['item'][1])
CLI_MSG_CHOOSEN_PROD.format(product_asked['item'][1]) +\ head_msg += CLI_MSG_CHOOSEN_PROD.format(product_asked['item'][1])
CLI_MSG_CHOOSEN_SUBST.format(substit_asked['item'][1]) head_msg += CLI_MSG_SUBST
backup_list = { # No substitute found
'results_txt': CLI_MSG_DETAILLED_SUB.format( if substitute_list['max_id'] == -1:
code=LOCAL_DB.result[0]['code'], cli_end_msg = CLI_MSG_NO_SUBST.format(
nutri=LOCAL_DB.result[0]['nutrition_grades'], product_asked['item'][1],
url=LOCAL_DB.result[0]['url']) + CLI_MSG_ASK_BAK.format( product_asked['item'][2]
)
# Asks the user to select a substitute
elif substitute_list['max_id'] > 0:
substit_asked = ask_user(
head_msg,
substitute_list
)
##########################
# SHOW SUBTITUTE DETAILS #
##########################
if substit_asked['valid_item']:
LOCAL_DB.execute(DB_REQUEST['select_substitute'].format(
substit_asked['item'][3]
))
head_msg = CLI_MSG_DISCLAIMER +\
CLI_MSG_CHOOSEN_CAT.forqormat(substit_asked['item'][1])
backup_list = {
'results_txt': CLI_MSG_DETAILLED_SUB.format(
code=LOCAL_DB.result[0]['code'],
nutri=LOCAL_DB.result[0]['nutrition_grades'],
url=LOCAL_DB.result[0]['url']
) + CLI_MSG_ASK_BAK.format(
substit_asked['item'][1], substit_asked['item'][1],
product_asked['item'][1] product_asked['item'][1]
), ),
'results_list': [False, True], 'results_list': [False, True],
'max_id': 1 'max_id': 1
} }
# Saves if user choose it # Saves if user choose it
backup_asked = ask_user( backup_asked = ask_user(
head_msg, head_msg,
backup_list backup_list
) )
if backup_asked['valid_item'] and backup_asked['item']: if backup_asked['valid_item'] and backup_asked['item']:
LOCAL_DB.execute(DB_REQUEST['save_substitute'].format( LOCAL_DB.execute(DB_REQUEST['save_substitute'].format(
substit_asked['item'][3], substit_asked['item'][3],
product_asked['item'][3] product_asked['item'][3]
)) ))
if LOCAL_DB.cursor.rowcount == 1: if LOCAL_DB.cursor.rowcount == 1:
cli_end_msg = CLI_MSG_BAK_DONE cli_end_msg = CLI_MSG_BAK_DONE
print(cli_end_msg) print(cli_end_msg)

View File

@ -32,30 +32,38 @@ DB_REQUEST = {
'list_substitute': "SELECT p.name, p.nutrition_grades AS 'option', p.id AS 'id' FROM product AS p LEFT JOIN category AS c ON p.category_id = c.id WHERE c.id = '{}' AND p.nutrition_grades < '{}'", 'list_substitute': "SELECT p.name, p.nutrition_grades AS 'option', p.id AS 'id' FROM product AS p LEFT JOIN category AS c ON p.category_id = c.id WHERE c.id = '{}' AND p.nutrition_grades < '{}'",
'select_substitute': "SELECT p.*, c.name FROM product AS p LEFT JOIN category AS c ON p.category_id = c.id WHERE p.id = '{}'", 'select_substitute': "SELECT p.*, c.name FROM product AS p LEFT JOIN category AS c ON p.category_id = c.id WHERE p.id = '{}'",
'save_substitute': "UPDATE product SET substitute_id={} WHERE id={}", 'save_substitute': "UPDATE product SET substitute_id={} WHERE id={}",
'list_substituated_prod': "SELECT p.name AS pname, p.nutrition_grades AS pnutri, sub.name AS sname, sub.nutrition_grades AS snutri FROM product AS p LEFT JOIN category AS c ON p.category_id = c.id JOIN product AS sub ON sub.id = p.substitute_id WHERE p.substitute_id IS NOT NULL;",
} }
CLI_ITEM_MAX_LEN = 30 CLI_MAX_LEN = 30
CLI_ITEM_LIST = "{} : {} \t {} : {}\n"
CLI_MSG_QUIT = "\nAu revoir!"
CLI_MSG_DISCLAIMER = "# # # Bienvenu sur le terminal # # #\n\n"
CLI_MSG_CAT = "Catégories disponibles :\n"
CLI_MSG_PROD = "Produits disponibles :\n"
CLI_MSG_SUBST = "Substituts disponibles :\n" CLI_MSG_SUBST = "Substituts disponibles :\n"
CLI_MSG_ASK_IDX = "Index choisi [0-{}] («Q»uitter) :" CLI_MSG_QUIT = "\nAu revoir!"
CLI_MSG_ASK_BAK = "Sauvegarder «{}»\nen substitut du produit «{}»?"\
"\n\t0: non\n\t1: oui\n\tQ: quitter"
CLI_ITEM_LIST = "{} : {} \t {} : {}\n"
CLI_MSG_INIT_MENU = CLI_MSG_SUBST + "Voulez vous les consulter?\n"\
"\n\t0: non\n\t1: oui"
CLI_MSG_ASK_BAK = "Sauvegarder «{}»\nen substitut du produit «{}»?"\
"\n\t0: non\n\t1: oui"
CLI_MSG_ASK_ERR = "\nSaisie incorrecte : «{}»"
CLI_MSG_ASK_IDX = "Index choisi [0-{}] :"
CLI_MSG_BAK_DONE = "\nSubstitut sauvegardé" + CLI_MSG_QUIT
CLI_MSG_CAT = "Catégories disponibles :\n"
CLI_MSG_CHOOSEN_CAT = "# # Categorie : [ {} ]\n" CLI_MSG_CHOOSEN_CAT = "# # Categorie : [ {} ]\n"
CLI_MSG_CHOOSEN_PROD = "# Produits : [ {} ]\n" CLI_MSG_CHOOSEN_PROD = "# Produits : [ {} ]\n"
CLI_MSG_CHOOSEN_SUBST = "Fiche complète du substitut : [ {} ]\n"
CLI_MSG_DETAILLED_SUB = "Nutriscore [ {nutri} ]\tCode [ {code} ]"\ CLI_MSG_DETAILLED_SUB = "Nutriscore [ {nutri} ]\tCode [ {code} ]"\
"\nURL:{url}\n\n" "\nURL:{url}\n\n"
CLI_MSG_DISCLAIMER = "# # # Bienvenu sur PyOFF # # #\n\n"
CLI_MSG_NO_SUBST = "Pas de substitut trouvé pour le produit «{}»"\ CLI_MSG_NO_SUBST = "Pas de substitut trouvé pour le produit «{}»"\
"(nutriscore : «{}»)" + CLI_MSG_QUIT "(nutriscore : «{}»)" + CLI_MSG_QUIT
CLI_MSG_PROD = "Produits disponibles :\n"
CLI_MSG_SUBST_LIST = "{pname}\t{sname}\n"
CLI_MSG_SUBST_TITLE = "\n" + "# # SUBSTITUTIONS ENREGISTRÉES # #".center(
2 * CLI_MAX_LEN
) + "\n"
CLI_MSG_SUBST_HEAD = "PRODUIT :".center(CLI_MAX_LEN) + \
"SUBSTITUT :".center(CLI_MAX_LEN) + "\n"
CLI_MSG_ASK_ERR = "\nSaisie incorrecte : «{}»"
CLI_MSG_BAK_DONE = "\nSustitut sauvegardé" + CLI_MSG_QUIT
# DATABASE # DATABASE
DB_CONFIG = { DB_CONFIG = {