278 "pip", Qt.MatchExactly | Qt.MatchCaseSensitive) |
276 "pip", Qt.MatchExactly | Qt.MatchCaseSensitive) |
279 if len(pipList) > 0: |
277 if len(pipList) > 0: |
280 pipVersionTuple = Globals.versionToTuple(pipList[0].text(1)) |
278 pipVersionTuple = Globals.versionToTuple(pipList[0].text(1)) |
281 |
279 |
282 return pipVersionTuple |
280 return pipVersionTuple |
|
281 |
|
282 def getPip(self): |
|
283 """ |
|
284 Public method to get a reference to the pip interface object. |
|
285 |
|
286 @return reference to the pip interface object |
|
287 @rtype Pip |
|
288 """ |
|
289 return self.__pip |
283 |
290 |
284 ####################################################################### |
291 ####################################################################### |
285 ## Slots handling widget signals below |
292 ## Slots handling widget signals below |
286 ####################################################################### |
293 ####################################################################### |
287 |
294 |
501 @type QTreeWidgetItem |
508 @type QTreeWidgetItem |
502 @param column activated column |
509 @param column activated column |
503 @type int |
510 @type int |
504 """ |
511 """ |
505 packageName = item.text(0) |
512 packageName = item.text(0) |
|
513 upgradable = bool(item.text(2)) |
506 if column == 1: |
514 if column == 1: |
507 # show details for installed version |
515 # show details for installed version |
508 packageVersion = item.text(1) |
516 packageVersion = item.text(1) |
509 else: |
517 else: |
510 # show details for available version or installed one |
518 # show details for available version or installed one |
511 if item.text(2): |
519 if item.text(2): |
512 packageVersion = item.text(2) |
520 packageVersion = item.text(2) |
513 else: |
521 else: |
514 packageVersion = item.text(1) |
522 packageVersion = item.text(1) |
515 |
523 |
516 self.__showPackageDetails(packageName, packageVersion) |
524 self.__showPackageDetails(packageName, packageVersion, |
|
525 upgradable=upgradable) |
517 |
526 |
518 @pyqtSlot(bool) |
527 @pyqtSlot(bool) |
519 def on_verboseCheckBox_clicked(self, checked): |
528 def on_verboseCheckBox_clicked(self, checked): |
520 """ |
529 """ |
521 Private slot to handle a change of the verbose package information |
530 Private slot to handle a change of the verbose package information |
561 """ |
570 """ |
562 Private slot to upgrade selected packages of the selected environment. |
571 Private slot to upgrade selected packages of the selected environment. |
563 """ |
572 """ |
564 packages = [itm.text(0) for itm in self.__selectedUpdateableItems()] |
573 packages = [itm.text(0) for itm in self.__selectedUpdateableItems()] |
565 if packages: |
574 if packages: |
566 ok = self.__executeUpgradePackages(packages) |
575 self.executeUpgradePackages(packages) |
567 if ok: |
|
568 self.on_refreshButton_clicked() |
|
569 |
576 |
570 @pyqtSlot() |
577 @pyqtSlot() |
571 def on_upgradeAllButton_clicked(self): |
578 def on_upgradeAllButton_clicked(self): |
572 """ |
579 """ |
573 Private slot to upgrade all packages of the selected environment. |
580 Private slot to upgrade all packages of the selected environment. |
574 """ |
581 """ |
575 packages = [itm.text(0) for itm in self.__allUpdateableItems()] |
582 packages = [itm.text(0) for itm in self.__allUpdateableItems()] |
576 if packages: |
583 if packages: |
577 ok = self.__executeUpgradePackages(packages) |
584 self.executeUpgradePackages(packages) |
578 if ok: |
|
579 self.on_refreshButton_clicked() |
|
580 |
585 |
581 @pyqtSlot() |
586 @pyqtSlot() |
582 def on_uninstallButton_clicked(self): |
587 def on_uninstallButton_clicked(self): |
583 """ |
588 """ |
584 Private slot to remove selected packages of the selected environment. |
589 Private slot to remove selected packages of the selected environment. |
585 """ |
590 """ |
586 packages = [itm.text(0) for itm in self.packagesList.selectedItems()] |
591 packages = [itm.text(0) for itm in self.packagesList.selectedItems()] |
|
592 self.executeUninstallPackages(packages) |
|
593 |
|
594 def executeUninstallPackages(self, packages): |
|
595 """ |
|
596 Public method to uninstall the given list of packages. |
|
597 |
|
598 @param packages list of package names to be uninstalled |
|
599 @type list of str |
|
600 """ |
587 if packages: |
601 if packages: |
588 ok = self.__pip.uninstallPackages( |
602 ok = self.__pip.uninstallPackages( |
589 packages, |
603 packages, |
590 venvName=self.environmentsComboBox.currentText()) |
604 venvName=self.environmentsComboBox.currentText()) |
591 if ok: |
605 if ok: |
592 self.on_refreshButton_clicked() |
606 self.on_refreshButton_clicked() |
593 |
607 |
594 def __executeUpgradePackages(self, packages): |
608 def executeUpgradePackages(self, packages): |
595 """ |
609 """ |
596 Private method to execute the pip upgrade command. |
610 Public method to execute the pip upgrade command. |
597 |
611 |
598 @param packages list of package names to be upgraded |
612 @param packages list of package names to be upgraded |
599 @type list of str |
613 @type list of str |
600 @return flag indicating success |
|
601 @rtype bool |
|
602 """ |
614 """ |
603 ok = self.__pip.upgradePackages( |
615 ok = self.__pip.upgradePackages( |
604 packages, venvName=self.environmentsComboBox.currentText(), |
616 packages, venvName=self.environmentsComboBox.currentText(), |
605 userSite=self.userCheckBox.isChecked()) |
617 userSite=self.userCheckBox.isChecked()) |
606 return ok |
618 if ok: |
|
619 self.on_refreshButton_clicked() |
607 |
620 |
608 @pyqtSlot() |
621 @pyqtSlot() |
609 def on_showPackageDetailsButton_clicked(self): |
622 def on_showPackageDetailsButton_clicked(self): |
610 """ |
623 """ |
611 Private slot to show information for the selected package. |
624 Private slot to show information for the selected package. |
612 """ |
625 """ |
613 item = self.packagesList.selectedItems()[0] |
626 item = self.packagesList.selectedItems()[0] |
614 if item: |
627 if item: |
615 packageName = item.text(0) |
628 packageName = item.text(0) |
|
629 upgradable = bool(item.text(2)) |
616 # show details for available version or installed one |
630 # show details for available version or installed one |
617 if item.text(2): |
631 if item.text(2): |
618 packageVersion = item.text(2) |
632 packageVersion = item.text(2) |
619 else: |
633 else: |
620 packageVersion = item.text(1) |
634 packageVersion = item.text(1) |
621 |
635 |
622 self.__showPackageDetails(packageName, packageVersion) |
636 self.__showPackageDetails(packageName, packageVersion, |
|
637 upgradable=upgradable) |
623 |
638 |
624 ####################################################################### |
639 ####################################################################### |
625 ## Search widget related methods below |
640 ## Search widget related methods below |
626 ####################################################################### |
641 ####################################################################### |
627 |
642 |
714 |
729 |
715 searchTerm = self.searchEditName.text().strip() |
730 searchTerm = self.searchEditName.text().strip() |
716 searchTerm = bytes(QUrl.toPercentEncoding(searchTerm)).decode() |
731 searchTerm = bytes(QUrl.toPercentEncoding(searchTerm)).decode() |
717 urlQuery = QUrlQuery() |
732 urlQuery = QUrlQuery() |
718 urlQuery.addQueryItem("q", searchTerm) |
733 urlQuery.addQueryItem("q", searchTerm) |
719 url = QUrl(self.SearchUrl) |
734 url = QUrl(self.__pip.getIndexUrlSearch()) |
720 url.setQuery(urlQuery) |
735 url.setQuery(urlQuery) |
721 |
736 |
722 request = QNetworkRequest(QUrl(url)) |
737 request = QNetworkRequest(QUrl(url)) |
723 request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, |
738 request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, |
724 QNetworkRequest.AlwaysNetwork) |
739 QNetworkRequest.AlwaysNetwork) |
810 @pyqtSlot() |
826 @pyqtSlot() |
811 def on_installButton_clicked(self): |
827 def on_installButton_clicked(self): |
812 """ |
828 """ |
813 Private slot to handle pressing the Install button.. |
829 Private slot to handle pressing the Install button.. |
814 """ |
830 """ |
815 self.__install() |
831 packages = [ |
|
832 itm.text(0).strip() |
|
833 for itm in self.searchResultList.selectedItems() |
|
834 ] |
|
835 self.executeInstallPackages(packages) |
816 |
836 |
817 @pyqtSlot() |
837 @pyqtSlot() |
818 def on_installUserSiteButton_clicked(self): |
838 def on_installUserSiteButton_clicked(self): |
819 """ |
839 """ |
820 Private slot to handle pressing the Install to User-Site button.. |
840 Private slot to handle pressing the Install to User-Site button.. |
821 """ |
841 """ |
822 self.__install(userSite=True) |
842 packages = [ |
823 |
843 itm.text(0).strip() |
824 def __install(self, userSite=False): |
844 for itm in self.searchResultList.selectedItems() |
825 """ |
845 ] |
826 Private slot to install the selected packages. |
846 self.executeInstallPackages(packages, userSite=True) |
827 |
847 |
|
848 def executeInstallPackages(self, packages, userSite=False): |
|
849 """ |
|
850 Public method to install the given list of packages. |
|
851 |
|
852 @param packages list of package names to be installed |
|
853 @type list of str |
828 @param userSite flag indicating to install to the user directory |
854 @param userSite flag indicating to install to the user directory |
829 @type bool |
855 @type bool |
830 """ |
856 """ |
831 venvName = self.environmentsComboBox.currentText() |
857 venvName = self.environmentsComboBox.currentText() |
832 if venvName: |
858 if venvName and packages: |
833 packages = [] |
859 self.__pip.installPackages(packages, venvName=venvName, |
834 for itm in self.searchResultList.selectedItems(): |
860 userSite=userSite) |
835 packages.append(itm.text(0).strip()) |
861 self.on_refreshButton_clicked() |
836 if packages: |
|
837 self.__pip.installPackages(packages, venvName=venvName, |
|
838 userSite=userSite) |
|
839 self.on_refreshButton_clicked() |
|
840 |
862 |
841 @pyqtSlot() |
863 @pyqtSlot() |
842 def on_showDetailsButton_clicked(self): |
864 def on_showDetailsButton_clicked(self): |
843 """ |
865 """ |
844 Private slot to handle pressing the Show Details button. |
866 Private slot to handle pressing the Show Details button. |
870 item = self.searchResultList.selectedItems()[0] |
892 item = self.searchResultList.selectedItems()[0] |
871 |
893 |
872 packageVersion = item.data(0, self.SearchVersionRole) |
894 packageVersion = item.data(0, self.SearchVersionRole) |
873 packageName = item.text(0) |
895 packageName = item.text(0) |
874 |
896 |
875 self.__showPackageDetails(packageName, packageVersion) |
897 self.__showPackageDetails(packageName, packageVersion, |
876 |
898 installable=True) |
877 def __showPackageDetails(self, packageName, packageVersion): |
899 |
|
900 def __showPackageDetails(self, packageName, packageVersion, |
|
901 upgradable=False, installable=False): |
878 """ |
902 """ |
879 Private method to populate the package details dialog. |
903 Private method to populate the package details dialog. |
880 |
904 |
881 @param packageName name of the package to show details for |
905 @param packageName name of the package to show details for |
882 @type str |
906 @type str |
883 @param packageVersion version of the package |
907 @param packageVersion version of the package |
884 @type str |
908 @type str |
|
909 @param upgradable flag indicating that the package may be upgraded |
|
910 (defaults to False) |
|
911 @type bool (optional) |
|
912 @param installable flag indicating that the package may be installed |
|
913 (defaults to False) |
|
914 @type bool (optional) |
885 """ |
915 """ |
886 with E5OverrideCursor(): |
916 with E5OverrideCursor(): |
887 packageData = self.__pip.getPackageDetails( |
917 packageData = self.__pip.getPackageDetails( |
888 packageName, packageVersion) |
918 packageName, packageVersion) |
889 |
919 |
890 if packageData: |
920 if packageData: |
891 from .PipPackageDetailsDialog import PipPackageDetailsDialog |
921 from .PipPackageDetailsDialog import PipPackageDetailsDialog |
892 |
922 |
893 self.showDetailsButton.setEnabled(True) |
923 self.showDetailsButton.setEnabled(True) |
894 |
924 |
|
925 if installable: |
|
926 buttonsMode = PipPackageDetailsDialog.ButtonInstall |
|
927 elif upgradable: |
|
928 buttonsMode = ( |
|
929 PipPackageDetailsDialog.ButtonRemove | |
|
930 PipPackageDetailsDialog.ButtonUpgrade |
|
931 ) |
|
932 else: |
|
933 buttonsMode = PipPackageDetailsDialog.ButtonRemove |
|
934 |
895 if self.__packageDetailsDialog is not None: |
935 if self.__packageDetailsDialog is not None: |
896 self.__packageDetailsDialog.close() |
936 self.__packageDetailsDialog.close() |
897 |
937 |
898 self.__packageDetailsDialog = ( |
938 self.__packageDetailsDialog = ( |
899 PipPackageDetailsDialog(packageData, self) |
939 PipPackageDetailsDialog(packageData, buttonsMode=buttonsMode, |
|
940 parent=self) |
900 ) |
941 ) |
901 self.__packageDetailsDialog.show() |
942 self.__packageDetailsDialog.show() |
902 else: |
943 else: |
903 E5MessageBox.warning( |
944 E5MessageBox.warning( |
904 self, |
945 self, |
1040 if venvName: |
1081 if venvName: |
1041 from .PipPackagesInputDialog import PipPackagesInputDialog |
1082 from .PipPackagesInputDialog import PipPackagesInputDialog |
1042 dlg = PipPackagesInputDialog(self, self.tr("Install Packages")) |
1083 dlg = PipPackagesInputDialog(self, self.tr("Install Packages")) |
1043 if dlg.exec() == QDialog.Accepted: |
1084 if dlg.exec() == QDialog.Accepted: |
1044 packages, user = dlg.getData() |
1085 packages, user = dlg.getData() |
1045 if packages: |
1086 self.executeInstallPackages(packages, userSite=user) |
1046 self.__pip.installPackages(packages, venvName=venvName, |
|
1047 userSite=user) |
|
1048 self.on_refreshButton_clicked() |
|
1049 |
1087 |
1050 @pyqtSlot() |
1088 @pyqtSlot() |
1051 def __installLocalPackage(self): |
1089 def __installLocalPackage(self): |
1052 """ |
1090 """ |
1053 Private slot to install a package available on local storage. |
1091 Private slot to install a package available on local storage. |
1057 from .PipFileSelectionDialog import PipFileSelectionDialog |
1095 from .PipFileSelectionDialog import PipFileSelectionDialog |
1058 dlg = PipFileSelectionDialog(self, "package") |
1096 dlg = PipFileSelectionDialog(self, "package") |
1059 if dlg.exec() == QDialog.Accepted: |
1097 if dlg.exec() == QDialog.Accepted: |
1060 package, user = dlg.getData() |
1098 package, user = dlg.getData() |
1061 if package and os.path.exists(package): |
1099 if package and os.path.exists(package): |
1062 self.__pip.installPackages([package], venvName=venvName, |
1100 self.executeInstallPackages([package], userSite=user) |
1063 userSite=user) |
|
1064 self.on_refreshButton_clicked() |
|
1065 |
1101 |
1066 @pyqtSlot() |
1102 @pyqtSlot() |
1067 def __installRequirements(self): |
1103 def __installRequirements(self): |
1068 """ |
1104 """ |
1069 Private slot to install packages as given in a requirements file. |
1105 Private slot to install packages as given in a requirements file. |