def __init__(self, tree, parent, repo, layer, branch, branchCommitId): QTreeWidgetItem.__init__(self, parent) self.repo = repo self.tree = tree self.layer = layer self.branch = branch self.currentCommitId = None self.branchCommitId = branchCommitId self.setIcon(0, layerIcon) self.setText(0, self.layer) self.status = self.NOT_EXPORTED trackedlayer = getTrackingInfoForGeogigLayer(self.repo.url, layer) if trackedlayer: if os.path.exists(trackedlayer.geopkg): try: con = sqlite3.connect(trackedlayer.geopkg) cursor = con.cursor() cursor.execute("SELECT commit_id FROM geogig_audited_tables WHERE table_name='%s';" % layer) self.currentCommitId = cursor.fetchone()[0] cursor.close() con.close() if branchCommitId == self.currentCommitId: self.status = self.IN_SYNC else: self.status = self.NOT_IN_SYNC except: pass
def _removeLayer(self): user, email = config.getUserInfo() if user is None: return self.repo.removetree(self.layer, user, email, self.branch) config.iface.messageBar().pushMessage("Layer correctly removed from repository", level = QgsMessageBar.INFO, duration = 5) layer = getProjectLayerForGeoGigLayer(self.repo.url, self.layer) if layer: branches = self.repo.branches() layerInRepo = False for branch in branches: layers = self.repo.trees(branch) if self.layer in layers: layerInRepo = True break if not layerInRepo: setAsNonRepoLayer(layer) tracking = getTrackingInfoForGeogigLayer(self.repo.url, self.layer) if tracking: removeTrackedLayer(tracking.source) #TODO remove triggers from layer repoWatcher.repoChanged.emit(self.repo)
def exportFullRepo(repo, ref = geogig.HEAD): trees = repo.trees ref = repo.revparse(ref) for tree in trees: trackedlayer = getTrackingInfoForGeogigLayer(repo.url, tree.path) if trackedlayer is None or not os.path.exists(trackedlayer.source): filepath = os.path.join(repo.url, tree.path + ".shp") repo.exportshp(ref, tree.path, filepath, "utf-8") addTrackedLayer(filepath, repo.url, tree.path, ref) elif trackedlayer.ref != ref: repo.exportshp(ref, tree.path, trackedlayer.source, "utf-8") setRef(trackedlayer.source, ref)
def exportFullRepo(repo, ref=geogig.HEAD): trees = repo.trees ref = repo.revparse(ref) for tree in trees: trackedlayer = getTrackingInfoForGeogigLayer(repo.url, tree.path) if trackedlayer is None or not os.path.exists(trackedlayer.source): filepath = os.path.join(repo.url, tree.path + ".shp") repo.exportshp(ref, tree.path, filepath, "utf-8") addTrackedLayer(filepath, repo.url, tree.path, ref) elif trackedlayer.ref != ref: repo.exportshp(ref, tree.path, trackedlayer.source, "utf-8") setRef(trackedlayer.source, ref)
def exportVersion(self, repo, layer, commitId): trackedlayer = getTrackingInfoForGeogigLayer(repo.url, layer) if trackedlayer: if os.path.exists(trackedlayer.geopkg): try: con = sqlite3.connect(trackedlayer.geopkg) cursor = con.cursor() cursor.execute( "SELECT commit_id FROM geogig_audited_tables WHERE table_name='%s';" % layer) currentCommitId = cursor.fetchone()[0] cursor.close() con.close() if commitId != currentCommitId: msgBox = QMessageBox() msgBox.setWindowTitle("Layer was already exported") msgBox.setText( "This layer was exported already at a different commit.\n" "Which one would you like to add to your QGIS project?" ) msgBox.addButton( QPushButton('Use previously exported commit'), QMessageBox.YesRole) msgBox.addButton( QPushButton('Use latest commit from this branch'), QMessageBox.NoRole) msgBox.addButton(QPushButton('Cancel'), QMessageBox.RejectRole) QApplication.restoreOverrideCursor() ret = msgBox.exec_() if ret == 0: checkoutLayer(repo, layer, None, currentCommitId) elif ret == 1: try: layer = checkoutLayer(repo, layer, None, commitId) repoWatcher.layerUpdated.emit(layer) except HasLocalChangesError: QMessageBox.warning( config.iface.mainWindow(), 'Cannot export this commit', "The layer has local changes that would be overwritten.\n" "Either sync layer with branch or revert local changes " "before changing commit", QMessageBox.Ok) except: checkoutLayer(repo, layer, None, currentCommitId) else: checkoutLayer(repo, layer, None, commitId)
def _prepareDescription(): try: c = self.log(limit=1)[0] epoch = time.mktime(c.committerdate.timetuple()) offset = datetime.fromtimestamp( epoch) - datetime.utcfromtimestamp(epoch) d = c.committerdate + offset lastDate = d.strftime("%b %d, %Y %I:%M%p") author = c.authorname lastVersion = "%s (%s by %s)" % (c.message.splitlines()[0], lastDate, author) except: lastVersion = "" with open(resourceFile("descriptiontemplate_edit.html")) as f: s = "".join(f.readlines()) s = s.replace("[TITLE]", self.title) s = s.replace("[URL]", self.url) s = s.replace("[LAST_VERSION]", lastVersion) layers = [] for tree in self.trees(): trackedlayer = getTrackingInfoForGeogigLayer(self.url, tree) if trackedlayer: filepath = trackedlayer.geopkg try: con = sqlite3.connect(trackedlayer.geopkg) cursor = con.cursor() cursor.execute( "SELECT commit_id FROM geogig_audited_tables WHERE table_name='%s';" % tree) commitid = cursor.fetchone()[0] cursor.close() con.close() current = commitid except: current = "Not available" else: filepath = "Not exported" current = "Not available" layer = ( "<li><b>%s <a href='checkout:%s'>[Add to QGIS]</a></b>" "<p><i>Filepath</i>: <b>%s</b></p><p><i>Current version</i>: <b>%s</b></p></li>" ) % (tree, tree, filepath, current) layers.append(layer) layers = "<ul>%s</ul>" % "".join(layers) s = s.replace("[LAYERS]", layers) s = s.replace("[LAYERNAMES]", ",".join(self.trees())) return s
def exportFullRepo(repo, ref = geogig.HEAD): reponame = nameFromRepoPath(repo.url) repouser = userFromRepoPath(repo.url) repoowner = ownerFromRepoPath(repo.url) trees = repo.trees ref = repo.revparse(ref) for tree in trees: trackedlayer = getTrackingInfoForGeogigLayer(repo.url, tree.path) if trackedlayer is None or not os.path.exists(trackedlayer.source): filepath = os.path.join(repo.url, tree.path + ".shp") repo.exportshp(ref, tree.path, filepath) addTrackedLayer(filepath, reponame, repoowner, repouser, tree.path, ref) elif trackedlayer.ref != ref: repo.exportshp(ref, tree.path, trackedlayer.source) setRef(trackedlayer.source, ref)
def exportVersion(self, repo, layer, commitId): trackedlayer = getTrackingInfoForGeogigLayer(repo.url, layer) if trackedlayer: if os.path.exists(trackedlayer.geopkg): try: con = sqlite3.connect(trackedlayer.geopkg) cursor = con.cursor() cursor.execute("SELECT commit_id FROM geogig_audited_tables WHERE table_name='%s';" % layer) currentCommitId = cursor.fetchone()[0] cursor.close() con.close() if commitId != currentCommitId: msgBox = QMessageBox() msgBox.setWindowTitle("Layer was already exported") msgBox.setText("This layer was exported already at a different commit.\n" "Which one would you like to add to your QGIS project?") msgBox.addButton(QPushButton('Use previously exported commit'), QMessageBox.YesRole) msgBox.addButton(QPushButton('Use latest commit from this branch'), QMessageBox.NoRole) msgBox.addButton(QPushButton('Cancel'), QMessageBox.RejectRole) QApplication.restoreOverrideCursor() ret = msgBox.exec_() if ret == 0: checkoutLayer(repo, layer, None, currentCommitId) elif ret == 1: try: layer = checkoutLayer(repo, layer, None, commitId) repoWatcher.layerUpdated.emit(layer) except HasLocalChangesError: QMessageBox.warning(config.iface.mainWindow(), 'Cannot export this commit', "The layer has local changes that would be overwritten.\n" "Either sync layer with branch or revert local changes " "before changing commit",QMessageBox.Ok) except: checkoutLayer(repo, layer, None, currentCommitId) else: checkoutLayer(repo, layer, None, commitId)
def checkoutLayer(repo, layername, bbox, ref=None): ref = ref or repo.HEAD newCommitId = repo.revparse(ref) trackedlayer = getTrackingInfoForGeogigLayer(repo.url, layername) if trackedlayer is not None: if not os.path.exists(trackedlayer.geopkg): removeTrackedLayer(trackedlayer.source) trackedlayer = None filename = layerGeopackageFilename(layername, repo.title, repo.group) source = "%s|layername=%s" % (filename, layername) else: source = trackedlayer.source else: filename = layerGeopackageFilename(layername, repo.title, repo.group) source = "%s|layername=%s" % (filename, layername) if trackedlayer is None: repo.checkoutlayer(filename, layername, bbox, ref or repo.HEAD) addTrackedLayer(source, repo.url) try: layer = resolveLayerFromSource(source) iface.messageBar().pushMessage( "GeoGig", "Layer was already included in the current QGIS project", level=QgsMessageBar.INFO, duration=5) except WrongLayerSourceException: layer = loadLayerNoCrsDialog(source, layername, "ogr") QgsMapLayerRegistry.instance().addMapLayers([layer]) iface.messageBar().pushMessage("GeoGig", "Layer correctly added to project", level=QgsMessageBar.INFO, duration=5) elif ref is not None: currentCommitId = getCommitId(source) try: layer = resolveLayerFromSource(source) wasLoaded = True except WrongLayerSourceException: layer = loadLayerNoCrsDialog(source, layername, "ogr") wasLoaded = False if newCommitId != currentCommitId: if hasLocalChanges(layer): raise HasLocalChangesError() filename, layername = namesFromLayer(layer) repo.checkoutlayer(filename, layername, bbox, ref) layer.reload() if not wasLoaded: QgsMapLayerRegistry.instance().addMapLayers([layer]) iface.messageBar().pushMessage( "GeoGig", "Layer correctly added to project", level=QgsMessageBar.INFO, duration=5) else: iface.messageBar().pushMessage( "GeoGig", "Layer correctly updated to specified version", level=QgsMessageBar.INFO, duration=5) layer.triggerRepaint() else: if wasLoaded: iface.messageBar().pushMessage( "GeoGig", "Layer was already included in the current QGIS project", level=QgsMessageBar.INFO, duration=5) else: QgsMapLayerRegistry.instance().addMapLayers([layer]) iface.messageBar().pushMessage( "GeoGig", "Layer correctly added to the current QGIS project", level=QgsMessageBar.INFO, duration=5) repoWatcher.repoChanged.emit(repo) return layer
def __init__(self, tree, parent, repo, layer, branch, branchCommitId): QTreeWidgetItem.__init__(self, parent) self.repo = repo self.tree = tree self.layer = layer self.branch = branch self.currentCommitId = None self.setIcon(0, layerIcon) layout = QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) self.label = QLabel() self.label.setText(layer) self.labelLinks = QLabel() self.labelLinks.setText("<a href='#'>Add to QGIS</a>") self.label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) layout.addWidget(self.label) layout.addWidget(self.labelLinks) layout.addStretch() def add(): if self.status == self.NOT_IN_SYNC: msgBox = QMessageBox() msgBox.setText( "This layer was exported already at a different version.\nWhich version would you like to add to your QGIS project?" ) msgBox.addButton(QPushButton('Use exported version'), QMessageBox.YesRole) msgBox.addButton(QPushButton('Use version from this branch'), QMessageBox.NoRole) msgBox.addButton(QPushButton('Cancel'), QMessageBox.RejectRole) QApplication.restoreOverrideCursor() ret = msgBox.exec_() if ret == 0: checkoutLayer(self.repo, self.layer, None, self.currentCommitId) elif ret == 1: try: layer = checkoutLayer(self.repo, self.layer, None, branchCommitId) repoWatcher.layerUpdated.emit(layer) except HasLocalChangesError: QMessageBox.warning( config.iface.mainWindow(), 'Cannot change version', "There are local changes that would be overwritten.\n" "Revert them before changing version.", QMessageBox.Ok) else: checkoutLayer(self.repo, self.layer, None, branchCommitId) self.labelLinks.linkActivated.connect(add) w = QWidget() w.setLayout(layout) self.tree.setItemWidget(self, 0, w) self.status = self.NOT_EXPORTED trackedlayer = getTrackingInfoForGeogigLayer(self.repo.url, layer) if trackedlayer: try: con = sqlite3.connect(trackedlayer.geopkg) cursor = con.cursor() cursor.execute( "SELECT commit_id FROM geogig_audited_tables WHERE table_name='%s';" % layer) self.currentCommitId = cursor.fetchone()[0] cursor.close() con.close() if branchCommitId == self.currentCommitId: self.status = self.IN_SYNC else: self.status = self.NOT_IN_SYNC self.label.setText("<font color='orange'>%s</font>" % layer) except: pass