view_card_window.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. import datetime
  2. import os
  3. from json import loads, dumps
  4. from PyQt5 import uic
  5. from PyQt5.QtCore import QTimer
  6. from PyQt5.QtWidgets import QMainWindow, QSpinBox, QDateEdit, QTableWidgetItem, QPushButton, QFileDialog, QMessageBox
  7. PATH_TO_DATA_FILE = 'data.json'
  8. class ViewCardWin(QMainWindow):
  9. def __init__(self, parent, card):
  10. super().__init__()
  11. uic.loadUi('ui/AddCardWin.ui', self)
  12. self.pushButton_2.hide()
  13. self.pushButton.clicked.connect(self.back)
  14. self.pushButton_3.clicked.connect(self.save_data)
  15. self.par = parent
  16. self.lineEdit.setText(card['title']['serial'])
  17. self.lineEdit_2.setText(card['title']['number'])
  18. self.lineEdit_3.setText(card['title']['last_name'])
  19. self.lineEdit_4.setText(card['title']['first_name'])
  20. self.lineEdit_5.setText(card['title']['patronymic'])
  21. try:
  22. self.dateEdit.setDate(datetime.datetime.strptime(card['title']['birthday'], '%Y-%m-%d'))
  23. except Exception:
  24. pass
  25. try:
  26. self.dateEdit_2.setDate(datetime.datetime.strptime(card['title']['issue_date'], '%Y-%m-%d'))
  27. except Exception:
  28. pass
  29. self.lineEdit_6.setText(card['title']['profession'])
  30. self.lineEdit_7.setText(card['title']['education'])
  31. self.make_table(card)
  32. self.card_info = card
  33. self.pushButton_4.clicked.connect(self.add_row)
  34. self.tableWidget.verticalHeader().setVisible(False)
  35. self.widget.setVisible(False)
  36. self.widget_2.setVisible(False)
  37. self.widget_3.setVisible(False)
  38. self.pushButton_5.clicked.connect(self.dump_data)
  39. self.pushButton_6.clicked.connect(self.delete_work_book)
  40. self.tableWidget.setHorizontalHeaderLabels(['№ Записи', 'Дата', 'Сведенья', 'Документ', 'Удаление'])
  41. QTimer.singleShot(100, self.resize_table)
  42. def delete_work_book(self):
  43. with open(PATH_TO_DATA_FILE, 'r', encoding='utf-8') as file:
  44. data = loads(file.read())
  45. card_info = list(filter(lambda card: card['uuid'] == self.card_info['uuid'], data))[0]
  46. del data[data.index(card_info)]
  47. with open(PATH_TO_DATA_FILE, 'w', encoding='utf-8') as write_file:
  48. write_file.write(dumps(data))
  49. self.par.show()
  50. self.close()
  51. def dump_data(self):
  52. self.save_data()
  53. options = QFileDialog.Options()
  54. directory = QFileDialog.getExistingDirectory(self, "Выберите путь сохранения", options=options)
  55. if directory:
  56. dump_data_json = self.card_info.copy()
  57. if 'uuid' in dump_data_json:
  58. del dump_data_json['uuid']
  59. file_name = os.path.join(directory,
  60. f'{dump_data_json["title"]["last_name"]}_{dump_data_json["title"]["first_name"]}.json')
  61. with open(file_name, 'w', encoding='utf-8') as file:
  62. file.write(dumps(dump_data_json))
  63. QMessageBox.information(self, 'Данные выгружены', 'Данные успешно выгружены в файл')
  64. def make_table(self, card):
  65. self.tableWidget.clear()
  66. self.tableWidget.setRowCount(len(card['job']))
  67. for row in range(len(card['job'])):
  68. number_spin_box = QSpinBox(self)
  69. number_spin_box.setMinimum(1)
  70. number_spin_box.setMaximum(100000)
  71. number_spin_box.setValue(card['job'][row]['number'])
  72. self.tableWidget.setCellWidget(row, 0, number_spin_box)
  73. date_edit = QDateEdit()
  74. date_edit.setDate(datetime.date.today())
  75. date_edit.setMaximumDate(datetime.date.today())
  76. date_edit.setCalendarPopup(True)
  77. try:
  78. date_edit.setDate(datetime.datetime.strptime(card['job'][row]['date'], '%Y-%m-%d'))
  79. except Exception:
  80. pass
  81. self.tableWidget.setCellWidget(row, 1, date_edit)
  82. self.tableWidget.setItem(row, 2, QTableWidgetItem(card['job'][row]['job_info']))
  83. self.tableWidget.setItem(row, 3, QTableWidgetItem(card['job'][row]['basis']))
  84. delete_button = QPushButton()
  85. delete_button.setText('Удалить')
  86. delete_button.row = row
  87. delete_button.clicked.connect(self.delete_row)
  88. self.tableWidget.setCellWidget(row, 4, delete_button)
  89. def delete_row(self):
  90. sender = self.sender()
  91. self.tableWidget.removeRow(sender.row)
  92. for row in range(sender.row, self.tableWidget.rowCount()):
  93. self.tableWidget.cellWidget(row, 4).row -= 1
  94. def add_row(self):
  95. self.tableWidget.setRowCount(self.tableWidget.rowCount() + 1)
  96. number_spin_box = QSpinBox(self)
  97. number_spin_box.setMinimum(1)
  98. number_spin_box.setMaximum(100000)
  99. number_spin_box.setValue(self.tableWidget.rowCount())
  100. self.tableWidget.setCellWidget(self.tableWidget.rowCount() - 1, 0, number_spin_box)
  101. date_edit = QDateEdit()
  102. date_edit.setDate(datetime.date.today())
  103. date_edit.setMaximumDate(datetime.date.today())
  104. date_edit.setCalendarPopup(True)
  105. self.tableWidget.setCellWidget(self.tableWidget.rowCount() - 1, 1, date_edit)
  106. delete_button = QPushButton()
  107. delete_button.setText('Удалить')
  108. delete_button.row = self.tableWidget.rowCount() - 1
  109. delete_button.clicked.connect(self.delete_row)
  110. self.tableWidget.setCellWidget(self.tableWidget.rowCount() - 1, 4, delete_button)
  111. self.tableWidget.setItem(self.tableWidget.rowCount() - 1, 2, QTableWidgetItem(''))
  112. self.tableWidget.setItem(self.tableWidget.rowCount() - 1, 3, QTableWidgetItem(''))
  113. self.resize_table()
  114. def resize_table(self):
  115. if self.tableWidget.rowCount():
  116. row_height = min([90, max([50, self.tableWidget.height() // self.tableWidget.rowCount()])])
  117. for row in range(self.tableWidget.rowCount()):
  118. self.tableWidget.setRowHeight(row, row_height)
  119. column_width = max([100, self.tableWidget.width() // self.tableWidget.columnCount()])
  120. for column in range(self.tableWidget.columnCount()):
  121. self.tableWidget.setColumnWidth(column, column_width)
  122. def resizeEvent(self, a0, QResizeEvent=None):
  123. self.resize_table()
  124. def save_data(self):
  125. with open(PATH_TO_DATA_FILE, 'r', encoding='utf-8') as file:
  126. data = loads(file.read())
  127. card_info = list(filter(lambda card: card['uuid'] == self.card_info['uuid'], data))[0]
  128. data[data.index(card_info)] = {
  129. "uuid": self.card_info['uuid'],
  130. "title": {
  131. "serial": self.lineEdit.text(),
  132. "number": self.lineEdit_2.text(),
  133. "first_name": self.lineEdit_4.text(),
  134. "last_name": self.lineEdit_3.text(),
  135. "patronymic": self.lineEdit_5.text(),
  136. "birthday": str(self.dateEdit.date().toPyDate()),
  137. "issue_date": str(self.dateEdit_2.date().toPyDate()),
  138. "profession": self.lineEdit_6.text(),
  139. "education": self.lineEdit_7.text()
  140. },
  141. "job": [
  142. {
  143. "number": self.tableWidget.cellWidget(row, 0).value(),
  144. "date": str(self.tableWidget.cellWidget(row, 1).date().toPyDate()),
  145. "job_info": self.tableWidget.item(row, 2).text(),
  146. "basis": self.tableWidget.item(row, 3).text()
  147. }
  148. for row in range(self.tableWidget.rowCount())
  149. ]
  150. }
  151. self.card_info = {
  152. "uuid": self.card_info['uuid'],
  153. "title": {
  154. "serial": self.lineEdit.text(),
  155. "number": self.lineEdit_2.text(),
  156. "first_name": self.lineEdit_4.text(),
  157. "last_name": self.lineEdit_3.text(),
  158. "patronymic": self.lineEdit_5.text(),
  159. "birthday": str(self.dateEdit.date().toPyDate()),
  160. "issue_date": str(self.dateEdit_2.date().toPyDate()),
  161. "profession": self.lineEdit_6.text(),
  162. "education": self.lineEdit_7.text()
  163. },
  164. "job": [
  165. {
  166. "number": self.tableWidget.cellWidget(row, 0).value(),
  167. "date": str(self.tableWidget.cellWidget(row, 1).date().toPyDate()),
  168. "job_info": self.tableWidget.item(row, 2).text(),
  169. "basis": self.tableWidget.item(row, 3).text()
  170. }
  171. for row in range(self.tableWidget.rowCount())
  172. ]
  173. }
  174. with open(PATH_TO_DATA_FILE, 'w', encoding='utf-8') as write_file:
  175. write_file.write(dumps(data))
  176. def back(self):
  177. self.par.show()
  178. self.close()