# 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)}")