Ovh instance management with PySide2
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
6.2 KiB

  1. from PySide2.QtWidgets import QMainWindow, QApplication, QDialog
  2. from PySide2.QtCore import QAbstractListModel, QAbstractTableModel, Qt, Slot
  3. from MainApplication import Ui_MainWindow
  4. from UserDialog import Ui_userDialog
  5. import ovh_api
  6. # Abstract models
  7. class UserModel(QAbstractListModel):
  8. def __init__(self, users=[]):
  9. super().__init__()
  10. self.users = users
  11. def data(self, index, role):
  12. if role == Qt.DisplayRole:
  13. return self.users[index.row()][1]
  14. def rowCount(self, index):
  15. return len(self.users)
  16. class InstanceModel(QAbstractTableModel):
  17. def __init__(self, instances=[]):
  18. super().__init__()
  19. self.instances = instances
  20. def data(self, index, role):
  21. if role == Qt.DisplayRole:
  22. # we don't show id's, so +1
  23. return self.instances[index.row()][index.column() + 1]
  24. def rowCount(self, index):
  25. return len(self.instances)
  26. def columnCount(self, index):
  27. # we don't show id's, so -1
  28. if len(self.instances):
  29. return len(self.instances[0]) - 1
  30. return 0
  31. # UI Classes
  32. class UserDialog(QDialog, Ui_userDialog):
  33. """ A dialog to add and edit users"""
  34. def __init__(self, user=None):
  35. super().__init__()
  36. self.setupUi(self)
  37. if user:
  38. self.keyid= user[0]
  39. self.username = user[1]
  40. self.publickey = user[2]
  41. self.name.setText(self.username)
  42. self.key.setPlainText(self.publickey)
  43. @Slot()
  44. def accept(self):
  45. QApplication.setOverrideCursor(Qt.WaitCursor)
  46. if self.windowTitle() == 'Ajout':
  47. ovh_api.add_user(self.name.text(), self.key.toPlainText())
  48. else:
  49. if self.username != self.name.text() or self.publickey != self.key.toPlainText():
  50. ovh_api.delete_user(self.keyid)
  51. ovh_api.add_user(self.name.text(), self.key.toPlainText())
  52. QApplication.restoreOverrideCursor()
  53. super().accept()
  54. class MainWindow(QMainWindow, Ui_MainWindow):
  55. """ The main window"""
  56. def __init__(self, *args, obj=None, **kwargs):
  57. super(MainWindow, self).__init__(*args, **kwargs)
  58. self.setupUi(self)
  59. users = ovh_api.get_users()
  60. self.user_model = UserModel(users=users)
  61. self.userView.setModel(self.user_model)
  62. self.userView.selectionModel().selectionChanged.connect(self.change_user_selection)
  63. self.addButton.pressed.connect(self.add_user)
  64. self.deleteButton.pressed.connect(self.delete_user)
  65. self.editButton.pressed.connect(self.edit_user)
  66. self.instanciateButton.pressed.connect(self.instanciate)
  67. self.regionCombo.addItems(ovh_api.regions)
  68. instances = ovh_api.get_instances()
  69. self.instance_model = InstanceModel(instances=instances)
  70. self.instanceView.setModel(self.instance_model)
  71. self.instanceView.selectionModel().selectionChanged.connect(self.change_instance_selection)
  72. self.destroyButton.pressed.connect(self.destroy_instance)
  73. self.refreshButton.pressed.connect(self.refresh_instances)
  74. self.show()
  75. # Instances management methods
  76. @Slot()
  77. def instanciate(self):
  78. region = self.regionCombo.currentText()
  79. selected_idx = self.userView.selectedIndexes()
  80. QApplication.setOverrideCursor(Qt.WaitCursor)
  81. for usr_idx in selected_idx:
  82. row = usr_idx.row()
  83. user = self.user_model.users[row]
  84. user_id = user[0]
  85. username = user[1]
  86. ovh_api.create_instance(user_id, username, region)
  87. self.refresh_instances()
  88. QApplication.restoreOverrideCursor()
  89. @Slot()
  90. def change_instance_selection(self):
  91. selected_rows = self.instanceView.selectionModel().selectedRows()
  92. destroy_active = True if selected_rows else False
  93. self.destroyButton.setEnabled(destroy_active)
  94. @Slot()
  95. def destroy_instance(self):
  96. QApplication.setOverrideCursor(Qt.WaitCursor)
  97. selected_rows = self.instanceView.selectionModel().selectedRows()
  98. for idx in selected_rows:
  99. row = idx.row()
  100. instance_id = self.instance_model.instances[row][0]
  101. ovh_api.delete_instance(instance_id)
  102. self.refresh_instances()
  103. QApplication.restoreOverrideCursor()
  104. @Slot()
  105. def refresh_instances(self):
  106. QApplication.setOverrideCursor(Qt.WaitCursor)
  107. self.instance_model.instances = ovh_api.get_instances()
  108. self.instance_model.layoutChanged.emit()
  109. QApplication.restoreOverrideCursor()
  110. # Users management methods
  111. @Slot()
  112. def change_user_selection(self):
  113. del_active = False
  114. edit_active = False
  115. instanciate_active = False
  116. sel_idxes = self.userView.selectedIndexes()
  117. if sel_idxes:
  118. del_active = True
  119. instanciate_active = True
  120. if len(sel_idxes) == 1:
  121. edit_active = True
  122. self.deleteButton.setEnabled(del_active)
  123. self.editButton.setEnabled(edit_active)
  124. self.instanciateButton.setEnabled(instanciate_active)
  125. @Slot()
  126. def add_user(self):
  127. dlg = UserDialog()
  128. dlg.setWindowTitle('Ajout')
  129. if dlg.exec_():
  130. self.refresh_users()
  131. @Slot()
  132. def edit_user(self):
  133. usr_idx = self.userView.selectedIndexes()[0]
  134. row = usr_idx.row()
  135. user = self.user_model.users[row]
  136. dlg = UserDialog(user)
  137. dlg.setWindowTitle('Modification')
  138. if dlg.exec_():
  139. self.refresh_users()
  140. @Slot()
  141. def delete_user(self):
  142. # TODO : confirmation
  143. selected_idx = self.userView.selectedIndexes()
  144. QApplication.setOverrideCursor(Qt.WaitCursor)
  145. for usr_idx in selected_idx:
  146. row = usr_idx.row()
  147. user_id = self.user_model.users[row][0]
  148. res = ovh_api.delete_user(user_id)
  149. print(res)
  150. self.refresh_users()
  151. QApplication.restoreOverrideCursor()
  152. def refresh_users(self):
  153. self.user_model.users = ovh_api.get_users()
  154. self.user_model.layoutChanged.emit()
  155. self.userView.clearSelection()
  156. app = QApplication([])
  157. window = MainWindow()
  158. app.exec_()