def add(cls, socket, session): log.debug("Service.add") name = receive(socket=socket) service = session.query(orm.Service).filter(orm.Service.name == name) if service.first(): log.debug("Service name already taken") send(socket=socket, data=ERROR) else: log.debug("Service name is new") send(socket=socket, data=GOOD) company_name = receive(socket=socket) company = ( session.query(orm.Company) .filter(orm.Company.name == company_name) .first() ) if not company: log.debug("Company does not exist") send(socket=socket, data=ERROR) else: send(socket=socket, data=GOOD) content = receive(socket=socket) send(socket=socket, data=GOOD) price = receive(socket=socket) log.debug(f"Service={name}, {price}") session.add( orm.Service( name=name, price=price, company=company, ) ) session.commit() log.debug("Service.add END")
def edit(cls, socket, session): log.debug("Service.edit") cls.print(socket=socket, session=session) id_ = receive(socket=socket) service = session.query(orm.Service).get(id_) if service: send(socket=socket, data=GOOD) log.debug(f"ID={id_} found") while True: choice = receive(socket=socket) if choice == "1": change_ = receive(socket=socket) log.debug(f"Changing name to {change_}") service.name = change_ elif choice == "2": change_ = receive(socket=socket) log.debug(f"Changing price to {change_}") service.price = int(change_) elif choice == BREAK: log.debug("Service.edit BREAK") session.commit() break else: send(socket=socket, data=ERROR) log.debug("ID not found")
def vote(cls, socket, session, user): pass log.debug("Problems.vote") problems = session.query(orm.Problem).join(orm.LeftToVote).join(orm.User) problems = problems.filter(orm.LeftToVote.voter == user) table_problems = [] for problem in problems: table_problems.append( [problem.id, problem.creator.login, problem.description, problem.status] ) table = tabulate( headers=["ID", "Автор", "Описание", "Статус"], tabular_data=table_problems, tablefmt=table_format, ) send(socket=socket, data=table) problem_id = receive(socket=socket) problem = problems.filter(orm.Problem.id == int(problem_id)).first() if not problem: send(socket=socket, data=ERROR) log.debug("Problem is not exist") return decisions = problem.decisions send(socket=socket, data=cls.parse_decisions(decisions)) assessments = loads(receive(socket=socket)) sum_om_assessments = sum(assessments.values()) for id in assessments: decision_weigth = round(assessments[id] / sum_om_assessments, 2) decision = ( session.query(orm.Decision).filter(orm.Decision.id == int(id)).first() ) vote = orm.Vote( voter=user, decision_weigth=decision_weigth, decision=decision, decision_assessment=assessments[id], ) session.add(vote) left_to_vote = ( session.query(orm.LeftToVote) .filter(orm.LeftToVote.voter == user, orm.LeftToVote.problem == problem) .first() ) exist_left_to_vote = ( session.query(orm.LeftToVote) .filter(orm.LeftToVote.problem == problem) .all() ) if len(exist_left_to_vote) <= 1: log.debug("Left to vote dont exist") problem.status = Status.decided.value session.add(problem) session.delete(left_to_vote) session.commit()
def login(socket): while True: choice = menu( title="Главное меню", exit_option="Выход", options=[ "Вход как администратор", "Вход как пользователь", "Вход как эксперт", ], ) if choice == "1": obj = { "login": login_input(), "password": password_input(), "permissions": "admin", } send(socket=socket, data=obj) response = receive(socket=socket) if response == GOOD: User.admin_menu(socket=socket) else: print("Неверный логин или пароль") enter_to_continue() elif choice == "2": obj = { "login": login_input(), "password": password_input(), "permissions": "default", } send(socket=socket, data=obj) response = receive(socket=socket) if response == GOOD: User.default_menu(socket=socket) else: print("Неверный логин или пароль") enter_to_continue() elif choice == "3": obj = { "login": login_input(), "password": password_input(), "permissions": "expert", } send(socket=socket, data=obj) response = receive(socket=socket) if response == GOOD: User.expert_menu(socket=socket) else: print("Неверный логин или пароль") enter_to_continue() elif choice == "4": send(socket=socket, data=BREAK) break
def edit(cls, socket): clear() receive_and_print(socket=socket) id_ = integer_input("Введите id") send(socket=socket, data=id_) response = receive(socket=socket) if response == GOOD: while True: choice = menu(title="Изменение услуги", options=["Название", "Цену"]) if choice == "1": send(socket=socket, data=choice) name = string_input("Введите название") send(socket=socket, data=name) print("Успешно изменено") enter_to_continue() elif choice == "2": send(socket=socket, data=choice) price = integer_input("Введите цену") send(socket=socket, data=price) print("Успешно изменено") enter_to_continue() elif choice == "3": send(socket=socket, data=BREAK) break else: print("Неверный id") enter_to_continue()
def admin_menu(self): log.debug("User.admin_menu") while True: choice = receive(socket=self.socket) log.debug(f"Choice {choice}") if choice == "1": log.debug("Services menu") Service.menu(socket=self.socket, session=self.session) elif choice == "2": log.debug("Orders menu") Order.menu(socket=self.socket, session=self.session, user=self.user) elif choice == "3": log.debug("Users menu") Users.menu(socket=self.socket, session=self.session, user=self.user) elif choice == "4": log.debug("Companies menu") Company.menu( socket=self.socket, session=self.session, ) elif choice == "5": log.debug("Problems menu") Problems.menu(socket=self.socket, session=self.session, user=self.user) elif choice == BREAK: log.debug("admin_menu BREAK") break
def add(cls, socket, session, user, **kwargs): log.debug("Problems.add") experts = session.query(orm.User).filter(orm.User.permissions == "expert") if not experts.all(): send(socket=socket, data=ERROR) log.debug("No experts") return else: send(socket=socket, data=GOOD) log.debug("Experts found") obj = receive(socket=socket) obj = loads(obj) log.debug(f"Got obj {obj}") problem = orm.Problem(description=obj["description"], creator=user) for decision in obj["decisions"]: decision_ = orm.Decision(description=decision, problem=problem) session.add(decision_) log.debug("Created decisions") for expert in experts: left_to_vote = orm.LeftToVote(problem=problem, voter=expert) session.add(left_to_vote) log.debug(f"Created leftToVotes") session.add(problem) session.commit() log.debug("Problems.add END")
def sort(cls, socket, session): log.debug("Company.sort") while True: choice = receive(socket=socket) companies = [] if choice == "1": companies = session.query(orm.Company).order_by(orm.Company.id) elif choice == "2": companies = session.query(orm.Company).order_by(orm.Company.name) elif choice == "3": companies = session.query(orm.Company) companies = sorted( companies, key=lambda company: len(company.services), reverse=True ) elif choice == BREAK: log.debug("Services.sort BREAK") break table_companies = [] for company in companies: services_quantity = len(company.services) table_companies.append([company.id, company.name, services_quantity]) table = tabulate( headers=["ID", "Название", "Количество услуг"], tabular_data=table_companies, tablefmt=table_format, ) send(socket=socket, data=table) log.debug("Sort sent")
def print(cls, socket): clear() choice = type_of_output_input( "1. Проблемы с неоконченным голосованием\n" "2. Проблемы с оконченным голосованием") if choice == "1": send(socket=socket, data=choice) clear() receive_and_print(socket=socket) enter_to_continue() elif choice == "2": clear() send(socket=socket, data=choice) clear() receive_and_print(socket=socket) send( socket=socket, data=integer_input( "Введите id проблемы для детального просмотра"), ) response = receive(socket=socket) if response == ERROR: print("Неверный id") enter_to_continue() return receive_and_print(socket=socket) enter_to_continue()
def add(cls, socket): response = receive(socket=socket) if response == ERROR: print("Среди пользователей нет экспертов") enter_to_continue() return obj = {"description": string_input("Введите описание проблемы")} num = 1 obj["decisions"] = [string_input(f"Введите решение проблемы №{num}")] num += 1 decision = string_input(f"Введите решение проблемы №{num}") while decision in obj["decisions"]: print("Решения одной проблемы должны быть уникальны") decision = string_input(f"Введите решение проблемы №{num}") obj["decisions"].append(decision) while True: choice = menu(title="Добавить ещё?", options=["Да"]) if choice == "1": num += 1 decision = string_input(f"Введите решение проблемы №{num}") while decision in obj["decisions"]: print("Решения одной проблемы должны быть уникальны") decision = string_input(f"Введите решение проблемы №{num}") obj["decisions"].append(decision) elif choice == "2": send(socket=socket, data=obj) print("Проблема добавлена успешно") enter_to_continue() break
def add(cls, socket, session, user, **kwargs): log.debug("Order.add") Service.order_print(socket=socket, session=session) service_id = receive(socket=socket) service = session.query(orm.Service).get(service_id) if service: send(socket=socket, data=GOOD) log.debug("Right id") quantity = receive(socket=socket) quantity = int(quantity) log.debug(f"Quantity {quantity}") session.add(orm.Order(customer=user, service=service, quantity=quantity)) session.commit() log.debug("Order.add END") else: send(socket=socket, data=ERROR) log.debug("Wrong id")
def change_password(cls, socket): new_password = password_input("Введите новый пароль") send(socket=socket, data=new_password) response = receive(socket=socket) if response == ERROR: print("Нельзя изменить пароль на текущий") else: print("Пароль изменен") enter_to_continue()
def add(cls, socket): clear() send(socket=socket, data=string_input("Введите название")) response = receive(socket=socket) if response == ERROR: print("Компания с таким названием уже существует") enter_to_continue() else: print("Компания добавлен успешно") enter_to_continue()
def change_password(cls, socket, session, user): log.debug("Users.change_password") new_password = receive(socket=socket) if new_password == user.password: send(socket=socket, data=ERROR) log.debug("Same password") else: send(socket=socket, data=GOOD) user.password = new_password session.commit() log.debug("Users.change_password END")
def delete(cls, socket): clear() receive_and_print(socket=socket) id_ = integer_input("Введите id") send(socket=socket, data=id_) response = receive(socket=socket) if response == GOOD: print("Проблема удалена") else: print("Неверный id") enter_to_continue()
def add(cls, socket): clear() send(socket=socket, data=string_input("Введите название")) response = receive(socket=socket) if response == ERROR: print("Услуга с таким названием уже существует") enter_to_continue() else: clear() send(socket=socket, data=string_input("Введите название компании")) response = receive(socket=socket) if response == ERROR: print("Компании с таким именем не существует") enter_to_continue() else: clear() send(socket=socket, data=string_input("Введите описание услуги")) receive(socket=socket) send(socket=socket, data=integer_input("Введите цену")) print("Услуга добавлена успешно") enter_to_continue()
def delete(cls, socket, session): log.debug("Service.delete") cls.print(socket=socket, session=session) id_ = receive(socket=socket) service = session.query(orm.Service).get(id_) if service: send(socket=socket, data=GOOD) session.delete(service) session.commit() log.debug(f"Found and deleted ID={id_}") else: send(socket=socket, data=ERROR) log.debug("ID not found")
def add(cls, socket): clear() receive_and_print(socket=socket) service_id = integer_input("Введите id заказываемой услуги") send(socket=socket, data=service_id) response = receive(socket=socket) if response == ERROR: print("Неверный id") else: quantity = integer_input("Введите количество") send(socket=socket, data=quantity) print("Заказ добавлен успешно") enter_to_continue()
def delete(cls, socket, session, user, **kwargs): log.debug("Problems.delete") cls.print(socket=socket, session=session, user=user) id_ = receive(socket=socket) problem = session.query(orm.Problem).get(id_) if problem: send(socket=socket, data=GOOD) session.delete(problem) session.commit() log.debug(f"Found and deleted ID={id_}") else: send(socket=socket, data=ERROR) log.debug("ID not found")
def delete(cls, socket, session): log.debug("Company.delete") cls.print(socket=socket, session=session) id_ = receive(socket=socket) company = session.query(orm.Company).get(id_) if company: send(socket=socket, data=GOOD) session.delete(company) session.commit() log.debug(f"Found and deleted ID={id_}") else: send(socket=socket, data=ERROR) log.debug("ID not found")
def edit(cls, socket, session): log.debug("Company.edit") cls.print(socket=socket, session=session) id_ = receive(socket=socket) company = session.query(orm.Company).get(id_) if company: send(socket=socket, data=GOOD) log.debug(f"ID={id_} found") while True: choice = receive(socket=socket) if choice == "1": change_ = receive(socket=socket) log.debug(f"Changing name to {change_}") company.name = change_ session.commit() elif choice == BREAK: log.debug("Company.edit BREAK") session.commit() break else: send(socket=socket, data=ERROR) log.debug("ID not found")
def add(cls, socket, session): log.debug("Company.add") name = receive(socket=socket) company = session.query(orm.Company).filter(orm.Company.name == name) if company.first(): log.debug("company name already taken") send(socket=socket, data=ERROR) else: log.debug("company name is new") send(socket=socket, data=GOOD) session.add(orm.Company(name=name)) session.commit() log.debug("Company.add END")
def delete(cls, socket, session, **kwargs): log.debug("Users.delete") cls.print(socket=socket, session=session) id_ = receive(socket=socket) user = session.query(orm.User).get(id_) if user: send(socket=socket, data=GOOD) session.delete(user) session.commit() log.debug(f"Found and deleted ID={id_}") else: send(socket=socket, data=ERROR) log.debug("ID not found")
def expert_menu(self): log.debug("User.expert_menu") while True: choice = receive(socket=self.socket) log.debug(f"Choice {choice}") if choice == "1": Problems.vote(socket=self.socket, session=self.session, user=self.user) elif choice == "2": Problems.print_voted( socket=self.socket, session=self.session, user=self.user ) elif choice == BREAK: log.debug("User.expert_menu BREAK") break
def default_menu(self): log.debug("User.default_menu") while True: choice = receive(socket=self.socket) log.debug(f"Choice {choice}") if choice == "1": Order.add(socket=self.socket, session=self.session, user=self.user) elif choice == "2": Order.print_for_user( socket=self.socket, session=self.session, user=self.user ) elif choice == "3": Users.change_password( socket=self.socket, session=self.session, user=self.user ) elif choice == BREAK: log.debug("User.default_menu BREAK") break
def main_menu(self): log.debug("User.main_menu") while True: obj = receive(socket=self.socket) if obj == BREAK: log.debug("User.main_menu BREAK") break try: self.login(obj=obj) send(socket=self.socket, data=GOOD) log.debug(f"Logged in as {self.user.permissions}") if self.user.permissions == "admin": self.admin_menu() elif self.user.permissions == "default": self.default_menu() elif self.user.permissions == "expert": self.expert_menu() except AuthenticationFail: log.debug("Auth fail") send(socket=self.socket, data=ERROR)
def vote(cls, socket): clear() receive_and_print(socket=socket) id_ = integer_input("Введите id") send(socket=socket, data=id_) decisions = receive(socket=socket) if decisions == ERROR: print("Неверный id") enter_to_continue() return clear() decisions = loads(decisions) for id in decisions: assessment = max_min_10_input( f"Введите оценку решению от одного до 10\n {decisions[id]}") decisions[id] = int(assessment) clear() send(socket=socket, data=decisions) print("Спасибо, ваши голоса будут учитаны") enter_to_continue()
def add(cls, socket, session, **kwargs): log.debug("Users.add") while True: choice = receive(socket=socket) log.debug(f"choice {choice}") if choice == BREAK: log.debug("Users.add BREAK") break login = receive(socket=socket) user = session.query(orm.User).filter(orm.User.login == login).first() if user: log.debug("Login already taken") send(socket=socket, data=ERROR) else: log.debug("Login is new") send(socket=socket, data=GOOD) if choice == "3": position = receive(socket=socket) send(socket=socket, data=GOOD) log.debug(f"Position is {position}") academic_degree = receive(socket=socket) log.debug(f"Academic Degree is {academic_degree}") send(socket=socket, data=GOOD) obj = receive(socket=socket) obj = loads(obj) session.add( orm.User( login=obj["login"], password=obj["password"], permissions=obj["permissions"], position=position, academic_degree=academic_degree, ) ) session.commit() log.debug("Users.add END") return obj = receive(socket=socket) obj = loads(obj) session.add( orm.User( login=obj["login"], password=obj["password"], permissions=obj["permissions"], ) ) session.commit() log.debug("Users.add END")
def sort(cls, socket, session, **kwargs): log.debug("Order.sort") while True: choice = receive(socket=socket) log.debug(f"Choice {choice}") orders = [] if choice == "1": orders = session.query(orm.Order).order_by(orm.Order.id) elif choice == "2": orders = ( session.query(orm.Order) .join(orm.Service) .order_by(orm.Service.name) ) elif choice == "3": orders = ( session.query(orm.Order).join(orm.User).order_by(orm.User.login) ) elif choice == "4": orders = session.query(orm.Order).order_by(orm.Order.quantity) elif choice == BREAK: log.debug("Order.sort BREAK") break table_orders = [ [ order.id, str(order.service), order.customer, order.quantity, f"${order.service.price * order.quantity}", ] for order in orders ] table = tabulate( headers=["ID", "Услуга", "Покупатель", "Количество", "Стоимость"], tabular_data=table_orders, tablefmt=table_format, ) send(socket=socket, data=table) log.debug("Sort sent")
def sort(cls, socket, session): log.debug("Services.sort") while True: choice = receive(socket=socket) services = [] if choice == "1": services = session.query(orm.Service).order_by(orm.Service.id) elif choice == "2": services = session.query(orm.Service).order_by(orm.Service.name) elif choice == "3": services = session.query(orm.Service).order_by(orm.Service.price) elif choice == "4": companies = session.query(orm.Company).filter(orm.Company.services) for company in companies: services += company.services elif choice == BREAK: log.debug("Services.sort BREAK") break table_services = [] for service in services: quantity = 0 for order in service.orders: quantity += order.quantity table_services.append( [ service.id, service.name, service.company, f"${service.price}", f"{quantity} шт.", ] ) table = tabulate( headers=["ID", "Название", "Компания", "Цена", "Заказано"], tabular_data=table_services, tablefmt=table_format, ) send(socket=socket, data=table) log.debug("Sort sent")