| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- import datetime
- import os
- from json import loads, dumps
- from PyQt5 import uic
- from PyQt5.QtCore import QTimer
- from PyQt5.QtWidgets import QMainWindow, QSpinBox, QDateEdit, QTableWidgetItem, QPushButton, QFileDialog, QMessageBox
- PATH_TO_DATA_FILE = 'data.json'
- class ViewCardWin(QMainWindow):
- def __init__(self, parent, card):
- super().__init__()
- uic.loadUi('ui/AddCardWin.ui', self)
- self.pushButton_2.hide()
- self.pushButton.clicked.connect(self.back)
- self.pushButton_3.clicked.connect(self.save_data)
- self.par = parent
- self.lineEdit.setText(card['title']['serial'])
- self.lineEdit_2.setText(card['title']['number'])
- self.lineEdit_3.setText(card['title']['last_name'])
- self.lineEdit_4.setText(card['title']['first_name'])
- self.lineEdit_5.setText(card['title']['patronymic'])
- try:
- self.dateEdit.setDate(datetime.datetime.strptime(card['title']['birthday'], '%Y-%m-%d'))
- except Exception:
- pass
- try:
- self.dateEdit_2.setDate(datetime.datetime.strptime(card['title']['issue_date'], '%Y-%m-%d'))
- except Exception:
- pass
- self.lineEdit_6.setText(card['title']['profession'])
- self.lineEdit_7.setText(card['title']['education'])
- self.make_table(card)
- self.card_info = card
- self.pushButton_4.clicked.connect(self.add_row)
- self.tableWidget.verticalHeader().setVisible(False)
- self.widget.setVisible(False)
- self.widget_2.setVisible(False)
- self.widget_3.setVisible(False)
- self.pushButton_5.clicked.connect(self.dump_data)
- self.pushButton_6.clicked.connect(self.delete_work_book)
- self.tableWidget.setHorizontalHeaderLabels(['№ Записи', 'Дата', 'Сведенья', 'Документ', 'Удаление'])
- QTimer.singleShot(100, self.resize_table)
- def delete_work_book(self):
- with open(PATH_TO_DATA_FILE, 'r', encoding='utf-8') as file:
- data = loads(file.read())
- card_info = list(filter(lambda card: card['uuid'] == self.card_info['uuid'], data))[0]
- del data[data.index(card_info)]
- with open(PATH_TO_DATA_FILE, 'w', encoding='utf-8') as write_file:
- write_file.write(dumps(data))
- self.par.show()
- self.close()
- def dump_data(self):
- self.save_data()
- options = QFileDialog.Options()
- directory = QFileDialog.getExistingDirectory(self, "Выберите путь сохранения", options=options)
- if directory:
- dump_data_json = self.card_info.copy()
- if 'uuid' in dump_data_json:
- del dump_data_json['uuid']
- file_name = os.path.join(directory,
- f'{dump_data_json["title"]["last_name"]}_{dump_data_json["title"]["first_name"]}.json')
- with open(file_name, 'w', encoding='utf-8') as file:
- file.write(dumps(dump_data_json))
- QMessageBox.information(self, 'Данные выгружены', 'Данные успешно выгружены в файл')
- def make_table(self, card):
- self.tableWidget.clear()
- self.tableWidget.setRowCount(len(card['job']))
- for row in range(len(card['job'])):
- number_spin_box = QSpinBox(self)
- number_spin_box.setMinimum(1)
- number_spin_box.setMaximum(100000)
- number_spin_box.setValue(card['job'][row]['number'])
- self.tableWidget.setCellWidget(row, 0, number_spin_box)
- date_edit = QDateEdit()
- date_edit.setDate(datetime.date.today())
- date_edit.setMaximumDate(datetime.date.today())
- date_edit.setCalendarPopup(True)
- try:
- date_edit.setDate(datetime.datetime.strptime(card['job'][row]['date'], '%Y-%m-%d'))
- except Exception:
- pass
- self.tableWidget.setCellWidget(row, 1, date_edit)
- self.tableWidget.setItem(row, 2, QTableWidgetItem(card['job'][row]['job_info']))
- self.tableWidget.setItem(row, 3, QTableWidgetItem(card['job'][row]['basis']))
- delete_button = QPushButton()
- delete_button.setText('Удалить')
- delete_button.row = row
- delete_button.clicked.connect(self.delete_row)
- self.tableWidget.setCellWidget(row, 4, delete_button)
- def delete_row(self):
- sender = self.sender()
- self.tableWidget.removeRow(sender.row)
- for row in range(sender.row, self.tableWidget.rowCount()):
- self.tableWidget.cellWidget(row, 4).row -= 1
- def add_row(self):
- self.tableWidget.setRowCount(self.tableWidget.rowCount() + 1)
- number_spin_box = QSpinBox(self)
- number_spin_box.setMinimum(1)
- number_spin_box.setMaximum(100000)
- number_spin_box.setValue(self.tableWidget.rowCount())
- self.tableWidget.setCellWidget(self.tableWidget.rowCount() - 1, 0, number_spin_box)
- date_edit = QDateEdit()
- date_edit.setDate(datetime.date.today())
- date_edit.setMaximumDate(datetime.date.today())
- date_edit.setCalendarPopup(True)
- self.tableWidget.setCellWidget(self.tableWidget.rowCount() - 1, 1, date_edit)
- delete_button = QPushButton()
- delete_button.setText('Удалить')
- delete_button.row = self.tableWidget.rowCount() - 1
- delete_button.clicked.connect(self.delete_row)
- self.tableWidget.setCellWidget(self.tableWidget.rowCount() - 1, 4, delete_button)
- self.tableWidget.setItem(self.tableWidget.rowCount() - 1, 2, QTableWidgetItem(''))
- self.tableWidget.setItem(self.tableWidget.rowCount() - 1, 3, QTableWidgetItem(''))
- self.resize_table()
- def resize_table(self):
- if self.tableWidget.rowCount():
- row_height = min([90, max([50, self.tableWidget.height() // self.tableWidget.rowCount()])])
- for row in range(self.tableWidget.rowCount()):
- self.tableWidget.setRowHeight(row, row_height)
- column_width = max([100, self.tableWidget.width() // self.tableWidget.columnCount()])
- for column in range(self.tableWidget.columnCount()):
- self.tableWidget.setColumnWidth(column, column_width)
- def resizeEvent(self, a0, QResizeEvent=None):
- self.resize_table()
- def save_data(self):
- with open(PATH_TO_DATA_FILE, 'r', encoding='utf-8') as file:
- data = loads(file.read())
- card_info = list(filter(lambda card: card['uuid'] == self.card_info['uuid'], data))[0]
- data[data.index(card_info)] = {
- "uuid": self.card_info['uuid'],
- "title": {
- "serial": self.lineEdit.text(),
- "number": self.lineEdit_2.text(),
- "first_name": self.lineEdit_4.text(),
- "last_name": self.lineEdit_3.text(),
- "patronymic": self.lineEdit_5.text(),
- "birthday": str(self.dateEdit.date().toPyDate()),
- "issue_date": str(self.dateEdit_2.date().toPyDate()),
- "profession": self.lineEdit_6.text(),
- "education": self.lineEdit_7.text()
- },
- "job": [
- {
- "number": self.tableWidget.cellWidget(row, 0).value(),
- "date": str(self.tableWidget.cellWidget(row, 1).date().toPyDate()),
- "job_info": self.tableWidget.item(row, 2).text(),
- "basis": self.tableWidget.item(row, 3).text()
- }
- for row in range(self.tableWidget.rowCount())
- ]
- }
- self.card_info = {
- "uuid": self.card_info['uuid'],
- "title": {
- "serial": self.lineEdit.text(),
- "number": self.lineEdit_2.text(),
- "first_name": self.lineEdit_4.text(),
- "last_name": self.lineEdit_3.text(),
- "patronymic": self.lineEdit_5.text(),
- "birthday": str(self.dateEdit.date().toPyDate()),
- "issue_date": str(self.dateEdit_2.date().toPyDate()),
- "profession": self.lineEdit_6.text(),
- "education": self.lineEdit_7.text()
- },
- "job": [
- {
- "number": self.tableWidget.cellWidget(row, 0).value(),
- "date": str(self.tableWidget.cellWidget(row, 1).date().toPyDate()),
- "job_info": self.tableWidget.item(row, 2).text(),
- "basis": self.tableWidget.item(row, 3).text()
- }
- for row in range(self.tableWidget.rowCount())
- ]
- }
- with open(PATH_TO_DATA_FILE, 'w', encoding='utf-8') as write_file:
- write_file.write(dumps(data))
- def back(self):
- self.par.show()
- self.close()
|