Ovh instance management with PySide2
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

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