After Graduate Update

This commit is contained in:
Daniel 2025-11-26 19:31:33 +03:00
parent b92a91ab37
commit c6917dd85e
69 changed files with 7540 additions and 0 deletions

193
ressult/gui/partner_form.py Normal file
View file

@ -0,0 +1,193 @@
# gui/partner_form.py (обновленный)
"""
Форма для добавления/редактирования партнера с поддержкой авторизации
"""
from PyQt6.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QLabel,
QLineEdit, QComboBox, QPushButton, QMessageBox,
QFormLayout, QSpinBox)
from PyQt6.QtCore import pyqtSignal
import requests
class PartnerForm(QDialog):
partner_saved = pyqtSignal()
def __init__(self, parent=None, partner_data=None, auth=None):
super().__init__(parent)
self.partner_data = partner_data
self.auth = auth
self.setup_ui()
def setup_ui(self):
self.setWindowTitle("Добавить партнера" if not self.partner_data else "Редактировать партнера")
self.setModal(True)
self.resize(500, 400)
layout = QVBoxLayout()
# Форма ввода данных
form_layout = QFormLayout()
self.company_name = QLineEdit()
self.company_name.setPlaceholderText("Введите наименование компании")
form_layout.addRow("Наименование компании*:", self.company_name)
self.inn = QLineEdit()
self.inn.setPlaceholderText("Введите ИНН")
form_layout.addRow("ИНН*:", self.inn)
self.partner_type = QComboBox()
self.partner_type.addItems(["", "distributor", "retail", "wholesale", "dealer"])
self.partner_type.setPlaceholderText("Выберите тип партнера")
form_layout.addRow("Тип партнера:", self.partner_type)
self.rating = QSpinBox()
self.rating.setRange(0, 100)
self.rating.setSuffix("%")
form_layout.addRow("Рейтинг:", self.rating)
self.legal_address = QLineEdit()
self.legal_address.setPlaceholderText("Введите юридический адрес")
form_layout.addRow("Юридический адрес:", self.legal_address)
self.director_name = QLineEdit()
self.director_name.setPlaceholderText("Введите ФИО директора")
form_layout.addRow("ФИО директора:", self.director_name)
self.phone = QLineEdit()
self.phone.setPlaceholderText("+7XXXXXXXXXX")
form_layout.addRow("Телефон:", self.phone)
self.email = QLineEdit()
self.email.setPlaceholderText("email@example.com")
form_layout.addRow("Email:", self.email)
self.sales_locations = QLineEdit()
self.sales_locations.setPlaceholderText("Москва, Санкт-Петербург...")
form_layout.addRow("Регионы продаж:", self.sales_locations)
layout.addLayout(form_layout)
# Кнопки
buttons_layout = QHBoxLayout()
self.save_button = QPushButton("Сохранить")
self.save_button.clicked.connect(self.save_partner)
self.save_button.setStyleSheet("""
QPushButton {
background-color: #28a745;
color: white;
border: none;
padding: 8px 16px;
border-radius: 4px;
font-weight: bold;
}
QPushButton:hover {
background-color: #218838;
}
""")
self.cancel_button = QPushButton("Отмена")
self.cancel_button.clicked.connect(self.reject)
buttons_layout.addWidget(self.save_button)
buttons_layout.addWidget(self.cancel_button)
buttons_layout.addStretch()
layout.addLayout(buttons_layout)
self.setLayout(layout)
# Если редактирование, заполняем форму
if self.partner_data:
self.fill_form()
def fill_form(self):
"""Заполнение формы данными партнера"""
data = self.partner_data
self.company_name.setText(data.get('company_name', ''))
self.inn.setText(data.get('inn', ''))
partner_type = data.get('partner_type', '')
if partner_type:
index = self.partner_type.findText(partner_type)
if index >= 0:
self.partner_type.setCurrentIndex(index)
# Безопасное преобразование рейтинга
rating = data.get('rating', 0)
if isinstance(rating, float):
rating = int(rating)
self.rating.setValue(rating)
self.legal_address.setText(data.get('legal_address', ''))
self.director_name.setText(data.get('director_name', ''))
self.phone.setText(data.get('phone', ''))
self.email.setText(data.get('email', ''))
self.sales_locations.setText(data.get('sales_locations', ''))
def validate_form(self):
"""Валидация данных формы"""
errors = []
if not self.company_name.text().strip():
errors.append("Наименование компании обязательно")
if not self.inn.text().strip():
errors.append("ИНН обязателен")
if self.phone.text() and not self.phone.text().startswith('+'):
errors.append("Телефон должен начинаться с '+'")
return errors
def save_partner(self):
"""Сохранение партнера с авторизацией"""
errors = self.validate_form()
if errors:
QMessageBox.warning(self, "Ошибка валидации", "\n".join(errors))
return
partner_data = {
'company_name': self.company_name.text().strip(),
'inn': self.inn.text().strip(),
'partner_type': self.partner_type.currentText() or None,
'rating': self.rating.value(),
'legal_address': self.legal_address.text().strip() or None,
'director_name': self.director_name.text().strip() or None,
'phone': self.phone.text().strip() or None,
'email': self.email.text().strip() or None,
'sales_locations': self.sales_locations.text().strip() or None
}
try:
if self.partner_data:
# Обновление существующего партнера
response = requests.put(
f"http://localhost:8000/api/v1/partners/{self.partner_data['partner_id']}",
json=partner_data,
auth=self.auth,
timeout=10
)
else:
# Создание нового партнера
response = requests.post(
"http://localhost:8000/api/v1/partners",
json=partner_data,
auth=self.auth,
timeout=10
)
if response.status_code == 200:
self.partner_saved.emit()
QMessageBox.information(self, "Успех", "Партнер успешно сохранен")
self.accept()
elif response.status_code == 401:
QMessageBox.warning(self, "Ошибка авторизации", "Сессия истекла. Пожалуйста, войдите снова.")
else:
error_msg = response.json().get('detail', 'Неизвестная ошибка')
QMessageBox.warning(self, "Ошибка", f"Не удалось сохранить партнера: {error_msg}")
except requests.exceptions.ConnectionError:
QMessageBox.critical(self, "Ошибка", "Не удалось подключиться к серверу")
except Exception as e:
QMessageBox.critical(self, "Ошибка", f"Ошибка подключения: {str(e)}")