def initGui(self):
        layout = QVBoxLayout()
        self.tab = QTabWidget()
        self.table = QTableView()

        self.setLayout(layout)
        self.canvas = QgsMapCanvas()
        self.canvas.setCanvasColor(Qt.white)
        settings = QSettings()
        self.canvas.enableAntiAliasing(settings.value("/qgis/enable_anti_aliasing", False, type = bool))
        self.canvas.useImageToRender(settings.value("/qgis/use_qimage_to_render", False, type = bool))
        self.canvas.mapSettings().setDestinationCrs(self.crs)
        action = settings.value("/qgis/wheel_action", 0, type = float)
        zoomFactor = settings.value("/qgis/zoom_factor", 2, type = float)
        self.canvas.setWheelAction(QgsMapCanvas.WheelAction(action), zoomFactor)
        self.panTool = QgsMapToolPan(self.canvas)
        self.canvas.setMapTool(self.panTool)

        execute(self.createLayers)

        model = GeomDiffTableModel(self.data)
        self.table.setModel(model)
        self.table.resizeColumnsToContents()
        self.table.resizeRowsToContents()
        self.tab.addTab(self.canvas, "Map view")
        self.tab.addTab(self.table, "Table view")
        layout.addWidget(self.tab)

        self.resize(600, 500)
        self.setWindowTitle("Geometry comparison")
Пример #2
0
 def linkClicked(self):
     timepositions = self.coverage.timePositions()
     dlg = DownloadDialog(timepositions, self.tree)
     dlg.show()
     dlg.exec_()
     if dlg.timepositions:
         folder = os.path.join(dlg.folder, self.coverage.name())
         if not os.path.exists(folder):
             try:
                 os.makedirs(folder)
             except:
                 iface.messageBar().pushMessage("",
                     "Wrong output directory or error creating it",
                     level=QgsMessageBar.WARNING)
                 return
                 
         bandsFile = os.path.join(folder, "bands.json")
         with open(bandsFile, "w") as f:
             json.dump(self.coverage.bands, f) 
         startProgressBar("Downloading datacube subset", len(timepositions))
         for i, time in enumerate(timepositions):
             setProgressValue(i)
             layer = self.coverage.layerForTimePosition(time)
             execute(lambda: layer.saveTo(folder, dlg.roi))
         closeProgressBar()
         if dlg.openInDatacubePanel:
             execute(lambda: self.widget.addEndpoint(dlg.folder))
Пример #3
0
 def delete(self):
     ret = QMessageBox.question(self.tree, 'Delete layer',
             'Are you sure you want to delete this layer from this branch?',
             QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
     if ret == QMessageBox.No:
         return
     execute(lambda: self._removeLayer())
    def initGui(self):
        layout = QVBoxLayout()
        self.tab = QTabWidget()
        self.table = QTableView()

        self.setLayout(layout)
        self.canvas = QgsMapCanvas()
        self.canvas.setCanvasColor(Qt.white)
        settings = QSettings()
        self.canvas.enableAntiAliasing(
            settings.value("/qgis/enable_anti_aliasing", False, type=bool))
        self.canvas.useImageToRender(
            settings.value("/qgis/use_qimage_to_render", False, type=bool))
        self.canvas.mapSettings().setDestinationCrs(self.crs)
        action = settings.value("/qgis/wheel_action", 0, type=float)
        zoomFactor = settings.value("/qgis/zoom_factor", 2, type=float)
        self.canvas.setWheelAction(QgsMapCanvas.WheelAction(action),
                                   zoomFactor)
        self.panTool = QgsMapToolPan(self.canvas)
        self.canvas.setMapTool(self.panTool)

        execute(self.createLayers)

        model = GeomDiffTableModel(self.data)
        self.table.setModel(model)
        self.table.resizeColumnsToContents()
        self.table.resizeRowsToContents()
        self.tab.addTab(self.canvas, "Map view")
        self.tab.addTab(self.table, "Table view")
        layout.addWidget(self.tab)

        self.resize(600, 500)
        self.setWindowTitle("Geometry comparison")
 def revertChanges(self):
     execute(lambda: revertToBaseRevision(self.gpkgPath, self.layername))
     self.deletedFeatures = []
     self.modifiedFeatures = []
     self.addedFeatures = []
     self.localChangesAvailable.emit(self.hasLocalChanges())
     self.layer.triggerRepaint()
Пример #6
0
 def __init__(self, repo, layer=None):
     self.repo = repo
     self.layer = layer
     self.ref = None
     QDialog.__init__(self, config.iface.mainWindow(),
                      Qt.WindowSystemMenuHint | Qt.WindowTitleHint)
     execute(self.initGui)
 def __init__(self, repo, layer=None):
     self.repo = repo
     self.layer = layer
     self.ref = None
     QDialog.__init__(self, config.iface.mainWindow(),
                            Qt.WindowSystemMenuHint | Qt.WindowTitleHint)
     execute(self.initGui)
    def setDiffContent(self, commit, commit2):
        if self.layer is None:
            layers = set(self.server.layers(self.user, self.repo, commit.commitid))
            layers2 = set(self.server.layers(self.user, self.repo, commit2))
            layers = layers.union(layers2)
        else:
            layers = [self.layer]

        diffs = {layer: execute(lambda: self.server.diff(self.user, self.repo, layer, commit.commitid, commit2)) for layer in layers}
        diffs = {key:value for (key,value) in diffs.items() if len(value) !=0}
        layers = [l for l in diffs.keys()]
        self.diffViewer.setChanges(diffs)

        self.canvas.setLayers([])
        self.removeMapLayers()
        extent = QgsRectangle()
        for layer in layers:
            if not diffs[layer]:
                continue
            beforeLayer, afterLayer = execute(lambda: self._getLayers(diffs[layer]))
            if afterLayer is not None:
                resourcesPath =  os.path.join(os.path.dirname(__file__), os.pardir, "resources")
                oldStylePath = os.path.join(resourcesPath, "{}_before.qml".format(
                                            QgsWkbTypes.geometryDisplayString(beforeLayer.geometryType())))
                newStylePath = os.path.join(resourcesPath, "{}_after.qml".format(
                                            QgsWkbTypes.geometryDisplayString(afterLayer.geometryType())))

                beforeLayer.loadNamedStyle(oldStylePath)
                afterLayer.loadNamedStyle(newStylePath)

                QgsProject.instance().addMapLayer(beforeLayer, False)
                QgsProject.instance().addMapLayer(afterLayer, False)

                extent.combineExtentWith(beforeLayer.extent())
                extent.combineExtentWith(afterLayer.extent())
                self.extraLayers.append(beforeLayer)
                self.extraLayers.append(afterLayer)
        # make extent a bit bit (10%) bigger
        # this gives some margin around the dataset (not cut-off at edges)
        if not extent.isEmpty():
            widthDelta = extent.width() * 0.05
            heightDelta = extent.height() * 0.05
            extent = QgsRectangle(extent.xMinimum() - widthDelta,
                                  extent.yMinimum() - heightDelta,
                                  extent.xMaximum() + widthDelta,
                                  extent.yMaximum() + heightDelta)

        layers = self.extraLayers
        hasChanges = False
        for layer in layers:
            if layer is not None and layer.featureCount() > 0:
                hasChanges = True
                break
        self.canvas.setLayers(layers)
        self.canvas.setExtent(extent)
        self.canvas.refresh()
                
        self.canvas.setVisible(hasChanges)
        self.labelNoChanges.setVisible(not hasChanges)
Пример #9
0
 def updateCurrentRepo(self, repo, force=False):
     if repo == self.currentRepo and not force:
         return
     def _update():
         self.currentRepo = repo
         self.versionsTree.updateContent(repo)
     try:
         self.repoTree.setSelectionMode(QAbstractItemView.NoSelection)
         self.repoTree.blockSignals(True)
         execute(_update)
     finally:
         self.repoTree.setSelectionMode(QAbstractItemView.SingleSelection)
         self.repoTree.blockSignals(False)
    def summaryTextBrowserAnchorClicked(self,url):
        url = url.url() #convert to string
        item = self.history.currentItem()
        if item is None:
            return
        commitid = item.commit.commitid

        cmd,layerName = url.split(".",1)
        if cmd == "addLive":
            execute(lambda: self.history.exportVersion(layerName,commitid,True))
        elif cmd == "addGeoPKG":
            self.history.exportVersion(layerName,commitid,False)
        elif cmd == "exportDiff":
            execute(lambda: self.history.exportDiff(item, None,layer=layerName))
Пример #11
0
 def plot(self,
          _filter=None,
          parameter=None,
          coverage=None,
          dataset=None,
          pt=None,
          rectangle=None):
     self.parameter = parameter or self.parameter
     self.coverage = coverage or self.coverage
     self.dataset = dataset or self.dataset
     self.pt = pt
     self.rectangle = rectangle
     self.filter = _filter
     execute(self._plot)
 def local(self):
     if self.conflict.localFeature is None:
         if self._local is None:
             self._local = execute(lambda: self.conflict.repo.feature(self.conflict.path, self.conflict.localCommit))
         return self._local
     else:
         return self.conflict.localFeature
Пример #13
0
 def local(self):
     if self.conflict.localFeature is None:
         if self._local is None:
             self._local = execute(lambda: self.conflict.repo.feature(
                 self.conflict.path, self.conflict.localCommit))
         return self._local
     else:
         return self.conflict.localFeature
Пример #14
0
def addRepoEndpoint(url, title):
    global repoEndpoints
    global repos
    repoEndpoints[title] = url
    saveRepoEndpoints()
    _repos = execute(lambda: repositoriesFromUrl(url, title))
    repos.extend(_repos)
    availableRepoEndpoints[title] = url
    return _repos
Пример #15
0
    def textPullRequestInfoAnchorClicked(self, url):
        url = url.url()  # convert to string
        cmd, layerName = url.split(".", 1)
        if cmd == "editDesc":
            dlg = EditDescription(self.prDescription)
            r = dlg.exec_()
            if r:
                self.prDescription = dlg.description
                self.setupInfo()
        if cmd == "exportDiff":
            execute(lambda: self.exportDiff(layer=layerName))
        if cmd == "exportDiffLocal":
            execute(lambda: self.exportDiffLocal(layer=layerName))
        if cmd == "sync":
            if self.creatingPr:
                user = self.user
                repo = self.repo
                user2, repo2 = self.comboTarget.currentText().split(":")

                syncDialog = SynchronizeDialog(user, repo, self.server, user2,
                                               repo2, False)
                syncDialog.exec_()
                try:
                    self.showNormal()
                    self.raise_()
                    self.activateWindow()
                except:
                    pass
            else:
                pr = self.prs[self.comboPr.currentText()]
                user = pr["sourceRepo"]["owner"]["identity"]
                repo = pr["sourceRepo"]["identity"]
                user2 = pr["targetRepo"]["owner"]["identity"]
                repo2 = pr["targetRepo"]["identity"]
                syncDialog = SynchronizeDialog(user, repo, self.server, user2,
                                               repo2, False)
                syncDialog.exec_()
                try:
                    self.showNormal()
                    self.raise_()
                    self.activateWindow()
                except:
                    pass
            self.fillWithPrData()
Пример #16
0
    def tabChanged(self, tabIdx):
        THRESHOLD = 1500

        if tabIdx != 2:  # the full changed view
            return
        if self.fullHistory is not None:
            return
        if not self.fullDiffSummary:
            return
        if self.fullDiffSummaryTotal > THRESHOLD:
            text = QTextBrowser()
            text.setHtml(
                "<br><br><br><center><font size=+3><b>Too many changes to show - {:,} features changed</b></font>"
                .format(self.fullDiffSummaryTotal))
            layout = self.tabWidget.widget(2).layout()
            self.clearLayout(layout)
            #layout.setMargin(0)
            layout.addWidget(text)
            self.fullHistory = layout
            #self.tabWidget.widget(2).setLayout(layout)
            return
        # need to set it up
        layout = self.tabWidget.widget(2).layout()
        self.clearLayout(layout)

        #layout.setMargin(0)
        pr = self.prs[self.comboPr.currentText()]
        prid = pr["id"]
        total, diffsummary = self.server.diffSummaryPR(self.user, self.repo,
                                                       prid)
        if total is None:
            text = QTextBrowser()
            text.setHtml(
                "<br><br><br><center><font size=+3><b>PR is in Conflict - Please Synchronize</b></font>"
                .format(self.fullDiffSummaryTotal))
            layout = self.tabWidget.widget(2).layout()
            #layout.setMargin(0)
            self.clearLayout(layout)

            layout.addWidget(text)
            self.fullHistory = layout

            #self.tabWidget.widget(2).setLayout(layout)
            return
        layers = [l["path"] for l in diffsummary.values()]

        diffs = {
            layer: execute(lambda: list(
                self.server.diffPR(self.user, self.repo, layer, prid)[1]))
            for layer in layers
        }

        fullDiffView = DiffViewerWidget(diffs)
        fullDiffView.selectFirstChangedFeature()
        layout.addWidget(fullDiffView)
        self.fullHistory = layout
    def computeDiffs(self):
        self.commit1 = self.commit1Panel.getRef()
        self.commit2 = self.commit2Panel.getRef()

        self.featuresTree.clear()
        changes = execute(lambda: self.repo.diff(self.commit1.commitid, self.
                                                 commit2.commitid))
        layerItems = {}
        layerSubItems = {}
        self.changes = {}
        for c in changes:
            self.changes[c.path] = c
            layername = c.path.split("/")[0]
            featureid = c.path.split("/")[-1]
            if layername not in layerItems:
                item = QTreeWidgetItem()
                item.setText(0, layername)
                item.setIcon(0, layerIcon)
                layerItems[layername] = item
                addedItem = QTreeWidgetItem()
                addedItem.setText(0, "Added")
                addedItem.setIcon(0, addedIcon)
                removedItem = QTreeWidgetItem()
                removedItem.setText(0, "Removed")
                removedItem.setIcon(0, removedIcon)
                modifiedItem = QTreeWidgetItem()
                modifiedItem.setText(0, "Modified")
                modifiedItem.setIcon(0, modifiedIcon)
                layerSubItems[layername] = {
                    FEATURE_ADDED: addedItem,
                    FEATURE_REMOVED: removedItem,
                    FEATURE_MODIFIED: modifiedItem
                }
            item = FeatureItem(layername, featureid)
            layerSubItems[layername][c.changetype].addChild(item)
        for layername, item in layerItems.iteritems():
            for i in [FEATURE_ADDED, FEATURE_REMOVED, FEATURE_MODIFIED]:
                subItem = layerSubItems[layername][i]
                item.addChild(subItem)
                subItem.setText(
                    0, "%s [%i features]" %
                    (subItem.text(0), subItem.childCount()))

            self.featuresTree.addTopLevelItem(item)
        self.attributesTable.clear()
        self.attributesTable.verticalHeader().hide()
        self.attributesTable.horizontalHeader().hide()

        self.featuresTree.expandAll()
    def pull(self):
        dlg = RemoteRefDialog(self.repo)
        dlg.exec_()
        if dlg.remote is not None:
            conflicts = execute(lambda: self.repo.pull(dlg.remote, dlg.branch))
            if conflicts:
                ret = QMessageBox.warning(
                    iface.mainWindow(), "Conflict(s) found while syncing",
                    "There are conflicts between local repository and connection.\n"
                    "Do you want to continue and fix them?",
                    QMessageBox.Yes | QMessageBox.No)
                if ret == QMessageBox.No:
                    self.repo.closeTransaction(conflicts[0].transactionId)
                    return

                dlg = ConflictDialog(conflicts)
                dlg.exec_()
                solved, resolvedConflicts = dlg.solved, dlg.resolvedConflicts
                if not solved:
                    self.repo.closeTransaction(conflicts[0].transactionId)
                    return
                for conflict, resolution in zip(
                        conflicts, list(resolvedConflicts.values())):
                    if resolution == ConflictDialog.LOCAL:
                        conflict.resolveWithLocalVersion()
                    elif resolution == ConflictDialog.REMOTE:
                        conflict.resolveWithRemoteVersion()
                    elif resolution == ConflictDialog.DELETE:
                        conflict.resolveDeletingFeature()
                    else:
                        conflict.resolveWithNewFeature(resolution)
                user, email = config.getUserInfo()
                if user is None:
                    return
                self.repo.commitAndCloseMergeAndTransaction(
                    user, email, "Resolved merge conflicts",
                    conflicts[0].transactionId)
                config.iface.messageBar().pushMessage(
                    "Changes have been correctly pulled from the connection",
                    level=QgsMessageBar.INFO,
                    duration=5)
                repoWatcher.repoChanged.emit(self.repo)
            else:
                config.iface.messageBar().pushMessage(
                    "Changes have been correctly pulled from the connection",
                    level=QgsMessageBar.INFO,
                    duration=5)
                repoWatcher.repoChanged.emit(self.repo)
    def computeDiffs(self):
        self.commit1 = self.commit1Panel.getRef()
        self.commit2 = self.commit2Panel.getRef()

        self.featuresTree.clear()
        changes = execute(lambda: self.repo.diff(self.commit1.commitid, self.commit2.commitid))
        layerItems = {}
        layerSubItems = {}
        self.changes = {}
        for c in changes:
            self.changes[c.path] = c
            layername = c.path.split("/")[0]
            featureid = c.path.split("/")[-1]
            if layername not in layerItems:
                item = QTreeWidgetItem()
                item.setText(0, layername)
                item.setIcon(0, layerIcon)
                layerItems[layername] = item
                addedItem = QTreeWidgetItem()
                addedItem.setText(0, "Added")
                addedItem.setIcon(0, addedIcon)
                removedItem = QTreeWidgetItem()
                removedItem.setText(0, "Removed")
                removedItem.setIcon(0, removedIcon)
                modifiedItem = QTreeWidgetItem()
                modifiedItem.setText(0, "Modified")
                modifiedItem.setIcon(0, modifiedIcon)
                layerSubItems[layername] = {FEATURE_ADDED: addedItem,
                                            FEATURE_REMOVED: removedItem,
                                            FEATURE_MODIFIED:modifiedItem}
            item = FeatureItem(layername, featureid)
            layerSubItems[layername][c.changetype].addChild(item)
        for layername, item in layerItems.iteritems():
            for i in [FEATURE_ADDED, FEATURE_REMOVED, FEATURE_MODIFIED]:
                subItem = layerSubItems[layername][i]
                item.addChild(subItem)
                subItem.setText(0, "%s [%i features]" %
                                                    (subItem.text(0),
                                                     subItem.childCount()))

            self.featuresTree.addTopLevelItem(item)
        self.attributesTable.clear()
        self.attributesTable.verticalHeader().hide()
        self.attributesTable.horizontalHeader().hide()
        
        self.featuresTree.expandAll()
Пример #20
0
def refreshEndpoint(name):
    global repos
    global repoEndpoints
    global availableRepoEndpoints
    if name in availableRepoEndpoints:
        del availableRepoEndpoints[name]
    for repo in repos[::-1]:
        if repo.group == name:
            repos.remove(repo)
    if name in repoEndpoints:
        try:
            _repos = execute(
                lambda: repositoriesFromUrl(repoEndpoints[name], name))
            repos.extend(_repos)
            availableRepoEndpoints[name] = repoEndpoints[name]
        except:
            pass
Пример #21
0
def readRepos():
    global repos
    global repoEndpoints
    global availableRepoEndpoints
    repos = []
    repoEndpoints = {}
    availableRepoEndpoints = {}
    filename = os.path.join(userFolder(), "repositories")
    if os.path.exists(filename):
        repoDescs = json.load(open(filename))
        for r in repoDescs:
            repoEndpoints[r["title"]] = r["url"]
            try:
                _repos = execute(
                    lambda: repositoriesFromUrl(r["url"], r["title"]))
                repos.extend(_repos)
                availableRepoEndpoints[r["title"]] = r["url"]
            except:
                pass
Пример #22
0
 def createRepo(self):
     name, ok = QInputDialog.getText(self, 'Create repository',
                                           'Enter the repository name:')
     if ok:
         group = self.comboEndpoint.currentText()
         url = repository.repoEndpoints[group]
         try:
             repo = execute(lambda: createRepoAtUrl(url, group, name))
         except GeoGigException as e:
             config.iface.messageBar().pushMessage("Error", str(e),
                            level=QgsMessageBar.CRITICAL,
                            duration=5)
             return
         item = RepoItem(self, self.repoTree, repo)
         addRepo(repo)
         self.repoTree.addTopLevelItem(item)
         config.iface.messageBar().pushMessage("Create repository", "Repository correctly created",
                                        level=QgsMessageBar.INFO,
                                        duration=5)
Пример #23
0
 def addOrRemoveLayer(self):
     source = self.layer.source()
     if self.checkState(0) == Qt.Checked:
         try:
             layer = layerFromSource(source)
         except WrongLayerSourceException:
             layer = execute(self.layer.layer)
             if layer.isValid():
                 coverageName = self.layer.coverageName()
                 name = self.layer.datasetName()
                 addLayerIntoGroup(layer, name, coverageName, self.layer.bands())
                 mosaicWidget.updateDates()
             else:
                 iface.messageBar().pushMessage("", "Invalid layer.",
                                            level=QgsMessageBar.WARNING)
     else:
         try:
             layer = layerFromSource(source)
             QgsMapLayerRegistry.instance().removeMapLayers([layer.id()])
         except WrongLayerSourceException:
             pass
    def pull(self):
        dlg = RemoteRefDialog(self.repo)
        dlg.exec_()
        if dlg.remote is not None:
            conflicts = execute(lambda: self.repo.pull(dlg.remote, dlg.branch))
            if conflicts:
                ret = QMessageBox.warning(iface.mainWindow(), "Conflict(s) found while syncing",
                                          "There are conflicts between local repository and connection.\n"
                                          "Do you want to continue and fix them?",
                                          QMessageBox.Yes | QMessageBox.No)
                if ret == QMessageBox.No:
                    self.repo.closeTransaction(conflicts[0].transactionId)
                    return

                dlg = ConflictDialog(conflicts)
                dlg.exec_()
                solved, resolvedConflicts = dlg.solved, dlg.resolvedConflicts
                if not solved:
                    self.repo.closeTransaction(conflicts[0].transactionId)
                    return
                for conflict, resolution in zip(conflicts, list(resolvedConflicts.values())):
                    if resolution == ConflictDialog.LOCAL:
                        conflict.resolveWithLocalVersion()
                    elif resolution == ConflictDialog.REMOTE:
                        conflict.resolveWithRemoteVersion()
                    elif resolution == ConflictDialog.DELETE:
                        conflict.resolveDeletingFeature()
                    else:
                        conflict.resolveWithNewFeature(resolution)
                user, email = config.getUserInfo()
                if user is None:
                    return
                self.repo.commitAndCloseMergeAndTransaction(user, email, "Resolved merge conflicts", conflicts[0].transactionId)
                config.iface.messageBar().pushMessage("Changes have been correctly pulled from the connection",
                                               level = QgsMessageBar.INFO, duration = 5)
                repoWatcher.repoChanged.emit(self.repo)
            else:
                config.iface.messageBar().pushMessage("Changes have been correctly pulled from the connection",
                                               level = QgsMessageBar.INFO, duration = 5)
                repoWatcher.repoChanged.emit(self.repo)
Пример #25
0
 def addEndpoint(self, endpoint):
     execute(lambda: self.widget.addEndpoint(endpoint))
 def createMosaic(self):
     execute(self._createMosaic)
Пример #27
0
 def _apicall(self, command, payload={}, transaction=False):
     return execute(lambda: self.__apicall(command, payload, transaction))
Пример #28
0
 def remote(self):
     if self._remote is None:
         self._remote = execute(lambda: self.conflict.repo.feature(
             self.conflict.path, self.conflict.remoteCommit))
     return self._remote
 def origin(self):
     if self._origin is None:
         self._origin = execute(lambda: self.conflict.repo.feature(self.conflict.path, self.conflict.originCommit))
     return self._origin
 def remote(self):
     if self._remote is None:
         self._remote = execute(lambda: self.conflict.repo.feature(self.conflict.path, self.conflict.remoteCommit))
     return self._remote
Пример #31
0
 def origin(self):
     if self._origin is None:
         self._origin = execute(lambda: self.conflict.repo.feature(
             self.conflict.path, self.conflict.originCommit))
     return self._origin
Пример #32
0
 def runNextStep(self):
     self.stopBlinking()
     test = self.tests[self.currentTest]
     step = test.steps[self.currentTestStep]
     self.btnSkip.setEnabled(True)
     self.btnCancel.setEnabled(True)
     if os.path.exists(step.description):
         with open(step.description) as f:
             html = "".join(f.readlines())
         self.webView.setHtml(html)
     else:
         if step.function is not None:
             self.webView.setHtml(
                 step.description +
                 "<p><b>[This is an automated step. Please, wait until it has been completed]</b></p>"
             )
         else:
             self.webView.setHtml(
                 step.description +
                 "<p><b>[Click on the right-hand side buttons once you have performed this step]</b></p>"
             )
     QCoreApplication.processEvents()
     if self.currentTestStep == len(test.steps) - 1:
         if step.function is not None:
             self.btnTestOk.setEnabled(False)
             self.btnTestFailed.setEnabled(False)
             self.btnNextStep.setEnabled(False)
             self.btnSkip.setEnabled(False)
             self.btnCancel.setEnabled(False)
             self.webView.setEnabled(False)
             QCoreApplication.processEvents()
             try:
                 execute(step.function)
                 self.testPasses()
             except Exception as e:
                 if isinstance(e, AssertionError):
                     self.testFails("%s\n%s" %
                                    (str(e), traceback.format_exc()))
                 else:
                     self.testContainsError(
                         "%s\n%s" % (str(e), traceback.format_exc()))
         else:
             self.btnTestOk.setEnabled(True)
             self.btnTestOk.setText("Test passes")
             self.btnTestFailed.setEnabled(True)
             self.btnTestFailed.setText("Test fails")
             self.webView.setEnabled(True)
             self.btnNextStep.setEnabled(False)
             if step.prestep:
                 try:
                     execute(step.prestep)
                 except Exception as e:
                     if isinstance(e, AssertionError):
                         self.testFailsAtSetup(
                             "%s\n%s" % (str(e), traceback.format_exc()))
                     else:
                         self.testContainsError(
                             "%s\n%s" % (str(e), traceback.format_exc()))
     else:
         if step.function is not None:
             self.btnTestOk.setEnabled(False)
             self.btnTestFailed.setEnabled(False)
             self.btnNextStep.setEnabled(False)
             self.btnSkip.setEnabled(False)
             self.btnCancel.setEnabled(False)
             self.webView.setEnabled(False)
             QCoreApplication.processEvents()
             try:
                 execute(step.function)
                 self.currentTestStep += 1
                 self.runNextStep()
             except Exception as e:
                 if isinstance(e, AssertionError):
                     self.testFails("%s\n%s" %
                                    (str(e), traceback.format_exc()))
                 else:
                     self.testContainsError(
                         "%s\n%s" % (str(e), traceback.format_exc()))
         else:
             self.currentTestStep += 1
             self.webView.setEnabled(True)
             self.btnNextStep.setEnabled(not step.isVerifyStep)
             if step.isVerifyStep:
                 self.btnTestOk.setEnabled(True)
                 self.btnTestOk.setText("Step passes")
                 self.btnTestFailed.setEnabled(True)
                 self.btnTestFailed.setText("Step fails")
             else:
                 self.btnTestOk.setEnabled(False)
                 self.btnTestFailed.setEnabled(False)
             if step.prestep:
                 try:
                     execute(step.prestep)
                 except Exception as e:
                     if isinstance(e, AssertionError):
                         self.testFailsAtSetup(
                             "%s\n%s" % (str(e), traceback.format_exc()))
                     else:
                         self.testContainsError(
                             "%s\n%s" % (str(e), traceback.format_exc()))
     if step.function is None:
         self.startBlinking()
Пример #33
0
 def runNextStep(self):
     self.stopBlinking()
     test = self.tests[self.currentTest]
     step = test.steps[self.currentTestStep]
     self.btnSkip.setEnabled(True)
     self.btnCancel.setEnabled(True)
     if os.path.exists(step.description):
         with open(step.description) as f:
             html = "".join(f.readlines())
         self.webView.setHtml(html)
     else:
         if step.function is not None:
             self.webView.setHtml(step.description + "<p><b>[This is an automated step. Please, wait until it has been completed]</b></p>")
         else:
             self.webView.setHtml(step.description + "<p><b>[Click on the right-hand side buttons once you have performed this step]</b></p>")
     QCoreApplication.processEvents()
     if self.currentTestStep == len(test.steps) - 1:
         if step.function is not None:
             self.btnTestOk.setEnabled(False)
             self.btnTestFailed.setEnabled(False)
             self.btnNextStep.setEnabled(False)
             self.btnSkip.setEnabled(False)
             self.btnCancel.setEnabled(False)
             self.webView.setEnabled(False)
             QCoreApplication.processEvents()
             try:
                 execute(step.function)
                 self.testPasses()
             except Exception as e:
                 if isinstance(e, AssertionError):
                     self.testFails("%s\n%s" % (str(e), traceback.format_exc()))
                 else:
                     self.testContainsError("%s\n%s" % (str(e), traceback.format_exc()))
         else:
             self.btnTestOk.setEnabled(True)
             self.btnTestOk.setText("Test passes")
             self.btnTestFailed.setEnabled(True)
             self.btnTestFailed.setText("Test fails")
             self.webView.setEnabled(True)
             self.btnNextStep.setEnabled(False)
             if step.prestep:
                 try:
                     execute(step.prestep)
                 except Exception as e:
                     if isinstance(e, AssertionError):
                         self.testFailsAtSetup("%s\n%s" % (str(e), traceback.format_exc()))
                     else:
                         self.testContainsError("%s\n%s" % (str(e), traceback.format_exc()))
     else:
         if step.function is not None:
             self.btnTestOk.setEnabled(False)
             self.btnTestFailed.setEnabled(False)
             self.btnNextStep.setEnabled(False)
             self.btnSkip.setEnabled(False)
             self.btnCancel.setEnabled(False)
             self.webView.setEnabled(False)
             QCoreApplication.processEvents()
             try:
                 execute(step.function)
                 self.currentTestStep += 1
                 self.runNextStep()
             except Exception as e:
                 if isinstance(e, AssertionError):
                     self.testFails("%s\n%s" % (str(e), traceback.format_exc()))
                 else:
                     self.testContainsError("%s\n%s" % (str(e), traceback.format_exc()))
         else:
             self.currentTestStep += 1
             self.webView.setEnabled(True)
             self.btnNextStep.setEnabled(not step.isVerifyStep)
             if step.isVerifyStep:
                 self.btnTestOk.setEnabled(True)
                 self.btnTestOk.setText("Step passes")
                 self.btnTestFailed.setEnabled(True)
                 self.btnTestFailed.setText("Step fails")
             else:
                 self.btnTestOk.setEnabled(False)
                 self.btnTestFailed.setEnabled(False)
             if step.prestep:
                 try:
                     execute(step.prestep)
                 except Exception as e:
                     if isinstance(e, AssertionError):
                         self.testFailsAtSetup("%s\n%s" % (str(e), traceback.format_exc()))
                     else:
                         self.testContainsError("%s\n%s" % (str(e), traceback.format_exc()))
     if step.function is None:
         self.startBlinking()
Пример #34
0
 def exportAllDiff(self):
     execute(lambda: self.exportDiff())