After Graduate Update
This commit is contained in:
parent
b92a91ab37
commit
c6917dd85e
69 changed files with 7540 additions and 0 deletions
193
ressult/gui/partner_form.py
Normal file
193
ressult/gui/partner_form.py
Normal 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)}")
|
||||
Loading…
Add table
Add a link
Reference in a new issue