master-floor/ressult/gui/partner_form.py
2025-11-26 19:31:33 +03:00

193 lines
8.1 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.

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