Files
sun_project/My_bd/main.py
T
2024-09-13 00:10:39 +03:00

250 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import sys
import functions
sys.path.append('tables')
from project_config import *
from dbconnection import *
from tables.stations_table import *
from tables.routes_table import *
class Main:
config = ProjectConfig()
connection = DbConnection(config)
def __init__(self):
DbTable.dbconn = self.connection
return
def db_init(self):
st = StationTable()
rt = RoutesTable()
st.create()
rt.create()
return
def db_insert_somethings(self):
st = StationTable()
rt = RoutesTable()
st.example_insert()
rt.example_insert()
def db_drop(self):
rt = RoutesTable()
st = StationTable()
rt.drop()
st.drop()
return
def show_main_menu(self):
menu = """Добро пожаловать!
Основное меню (выберите цифру в соответствии с необходимым действием):
1 - просмотр станций;
2 - сброс и инициализация таблиц;
10 - выход."""
print(menu)
return
def read_next_step(self):
return input("=> ").strip()
def after_main_menu(self, next_step):
if next_step == "2":
self.db_drop()
self.db_init()
self.db_insert_somethings()
print("Таблицы созданы заново!")
return "0"
elif next_step != "1" and next_step != "10":
print("Выбрано неверное число! Повторите ввод!")
return "0"
else:
return next_step
def show_stations(self):
self.st_id = -1
self.st_arr = []
self.max_name_len = 0
lst = StationTable().all()
self.max_st_index = len(lst)
for i in lst:
self.st_arr.append([str(i[2]), str(i[3]), str(i[1])])
self.max_name_len = max(self.max_name_len, len(str(i[2])))
menu = f"""Просмотр списка станций.
\tНазвание {" "*(self.max_name_len-4)}Тарифная зона{" " *3}Индекс\n\
----------------------------------------------------------------"""
print(menu)
for i in range(len(lst)):
txt = str(i+1) + "\t"
txt += self.st_arr[i][0] + " "*(4+self.max_name_len-len(self.st_arr[i][0]))
txt += self.st_arr[i][1] + " "*(13 - len(self.st_arr[i][1]) + 3) + self.st_arr[i][2]
print(txt)
menu = """Дальнейшие операции:
0 - возврат в главное меню;
4 - удаление станции;
5 - добавление станции;
6 - изменение названия станций;
7 - просмотр маршрутов;
9 - добавление маршрута(с использованием станций);
10 - выход."""
print(menu)
return
def after_show_stations(self, next_step):
while True:
if next_step == "4":#delete station
x = functions.validate_input('Введите номер удаляемой станции (0 - для отмены): ', 0, self.max_st_index)
if(x!=-1):
StationTable().delete(self.st_arr[int(x)-1])
print('Станция успешно удалена')
return "1"
elif next_step == "5":#insert station
StationTable().insert()
print('Станция успешно добавлена')
return "1"
elif next_step == "6":#update station
x = functions.validate_input('Введите номер изменяемой станции (0 - для отмены): ', 0, self.max_st_index)
if(x!=-1):
StationTable().update(self.st_arr[int(x)-1])
print('Станция успешно изменена')
return "1"
elif(next_step == "8"): # delete route
if(self.st_id != -1):
x = functions.validate_input('Введите номер удаляемого маршрута (0 - для отмены): ', 0, self.max_rt_index)
if(x!=-1):
RoutesTable().delete(self.rt_arr[int(x)-1])
print('Маршрут успешно удален')
else:
next_step = "7"
return "1"
else:
print("Необходимо выбрать станцию")
return "1"
elif next_step == "7":#show routes
self.show_routes_with_station()
elif next_step == "9":#insert route
RoutesTable().insert(self.max_st_index)
print('Маршрут успешно добавлен')
return "1"
elif next_step != "0" and next_step != "10":
print("Выбрано неверное число! Повторите ввод!")
return "1"
else:
return next_step
def show_routes_with_station(self):
"""Вывод всех маршрутов по введенной станции
"""
self.routes_arr = []
if self.st_id == -1:
while True:
t = functions.validate_input('Вывести маршрут по:\
\n1 - начальной станции;\
\n2 - конечной станции;\n', 0, 2)
if t == 1:
x = functions.validate_input('Выберите номер интересуемой строки с начальной станцией (0 - отмена): ', 0, self.max_st_index)
if(x==-1):
return
else:
self.st_id = StationTable().find_by_name(self.st_arr[x-1][0])
self.st_obj = self.st_arr[x-1][0]
lst = RoutesTable().all_by_st_id(self.st_id, 1)
self.max_rt_index = len(lst)
if lst == []:
print('Нет маршрута с такой начальной станцией')
else:
print("Выбрана station: " + self.st_obj)
print("Маршруты:")
print("№\tНомер маршрута\tВыбранная станция\tКонечная станция\
\n--------------------------------------------------------")
for i in lst:
self.routes_arr.append([str(i[0]), str(i[2]), i[1]])
for i in range(len(self.routes_arr)):
output = f"""{str(i+1)}\t{str(self.routes_arr[i][2])} \t\t\
{self.st_obj}\t\t{str(StationTable().name_by_id(self.routes_arr[i][1])[0])}"""
print(output)
menu = """Дальнейшие операции:
0 - возврат в главное меню;
1 - возврат в просмотр станций;
8 - удаление маршрута;
10 - выход."""
print(menu)
return self.read_next_step()
elif t == 2:
x = functions.validate_input('Выберите номер интересуемой строки с конечной станцией (0 - отмена): ', 0, self.max_st_index)
if(x==0):
return
else:
self.st_id = StationTable().find_by_name(self.st_arr[x-1][0])
self.st_obj = self.st_arr[x-1][0]
lst = RoutesTable().all_by_st_id(self.st_id, 2)
self.max_rt_index = len(lst)
if lst == []:
print('Нет маршрута с такой конечной станцией')
else:
print("Выбрана station: " + self.st_obj)
print("Маршруты:")
print("№\tНомер маршрута\tВыбранная станция\tНачальная станция\
\n--------------------------------------------------------")
for i in lst:
self.routes_arr.append([str(i[0]), str(i[2]), i[1]])
for i in range(len(self.routes_arr)):
output = f"""{str(i+1)}\t{str(self.routes_arr[i][1])} \t\t\
{self.st_obj}\t\t{str(StationTable().name_by_id(self.routes_arr[i][0])[0])}"""
print(output)
menu = """Дальнейшие операции:
0 - возврат в главное меню;
1 - возврат в просмотр станций;
8 - удаление маршрута;
10 - выход."""
print(menu)
return self.read_next_step()
else:
print("Неверный ввод!")
def main_cycle(self):
current_menu = "0"
next_step = None
while(current_menu != "10"):
if current_menu == "0":
self.show_main_menu()
next_step = self.read_next_step()
current_menu = self.after_main_menu(next_step)
elif current_menu == "1":
self.show_stations()
next_step = self.read_next_step()
current_menu = self.after_show_stations(next_step)
# elif current_menu == "2":
# self.show_main_menu()
# current_menu = "1"
print("До свидания!")
return
def test(self):
DbTable.dbconn.test()
m = Main()
# Откоментируйте эту строку и закоментируйте следующую для теста
# соединения с БД
# m.test()
m.main_cycle()