Ovh instance management with PySide2
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

198 líneas
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_()