def testConflictsWithDeleteAndModify(self): repo = _createSimpleTestRepo(True) log = repo.log() origCommit = log[0].commitid filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = log[0].commitid) layer = loadLayerNoCrsDialog(filename, "points", "ogr") idx = layer.dataProvider().fieldNameIndex("n") filename2 = tempFilename("gpkg") repo.checkoutlayer(filename2, "points", ref = log[0].commitid) layer2 = loadLayerNoCrsDialog(filename2, "points", "ogr") features = list(layer.getFeatures()) with edit(layer): layer.changeAttributeValue(features[0].id(), idx, 1000) layer.changeAttributeValue(features[1].id(), idx, 2000) _, _, conflicts, _ = repo.importgeopkg(layer, "master", "message", "me", "*****@*****.**", True) self.assertEqual(0, len(conflicts)) features2 = list(layer2.getFeatures()) with edit(layer2): layer2.deleteFeatures([features2[0].id()]) layer2.deleteFeatures([features2[1].id()]) _, _, conflicts, _ = repo.importgeopkg(layer2, "master", "another message", "me", "*****@*****.**", True) self.assertEqual(2, len(conflicts)) diff = repo.diff(repo.log()[0].commitid, repo.log()[1].commitid) self.assertEqual(diff[0].path, conflicts[0].path) self.assertEqual(origCommit, conflicts[0].originCommit) self.assertEqual(diff[1].path, conflicts[1].path)
def createSimpleTestRepo(group=None, name=None): repo = createRepoAtUrl(REPOS_SERVER_URL, group or "Lesson repos", name or "simple_%s" % str(time.time())) _importLayerToRepo(repo, "first") log = repo.log() filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = log[0].commitid) layer = QgsVectorLayer(filename, "points", "ogr") with edit(layer): feat = QgsFeature() feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(10, 10))) feat.setAttributes([3, 2]) layer.addFeatures([feat]) repo.importgeopkg(layer, "master", "second", "tester", "*****@*****.**", True) log = repo.log() filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = log[0].commitid) layer = QgsVectorLayer(filename, "points", "ogr") features = list(layer.getFeatures()) for feature in features: pt = feature.geometry().asPoint() if pt.x() == 10 and pt.y()== 10: featureid = feature.id() break with edit(layer): layer.changeGeometry(featureid, QgsGeometry.fromPoint(QgsPoint(5, 5))) repo.importgeopkg(layer, "master", "third", "tester", "*****@*****.**", True) repo.createbranch(repo.HEAD, "mybranch") repo.createtag(repo.HEAD, "mytag") global _lastRepo _lastRepo = repo return _lastRepo
def _createConflict(self): repo = _createSimpleTestRepo(True) log = repo.log() filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = log[0].commitid) layer = loadLayerNoCrsDialog(filename, "points", "ogr") idx = layer.dataProvider().fieldNameIndex("n") filename2 = tempFilename("gpkg") repo.checkoutlayer(filename2, "points", ref = log[0].commitid) layer2 = loadLayerNoCrsDialog(filename2, "points", "ogr") features = list(layer.getFeatures()) with edit(layer): layer.changeAttributeValue(features[0].id(), idx, 1000) layer.changeAttributeValue(features[1].id(), idx, 2000) _, _, conflicts, _ = repo.importgeopkg(layer, "master", "message", "me", "*****@*****.**", True) self.assertEqual(0, len(conflicts)) features2 = list(layer2.getFeatures()) with edit(layer2): layer2.changeAttributeValue(features2[0].id(), idx, 1001) layer2.changeAttributeValue(features2[1].id(), idx, 2001) layer3 = loadLayerNoCrsDialog(filename2, "points", "ogr") feature = next(layer3.getFeatures(QgsFeatureRequest(features2[0].id()))) self.assertEquals(1001, feature["n"]) _, _, conflicts, _ = repo.importgeopkg(layer2, "master", "another message", "me", "*****@*****.**", True) self.assertEqual(2, len(conflicts)) self.assertEqual(conflicts[0].localFeature['n'], 1001) return repo, conflicts
def testPullWithConflicts(self): repo = _createSimpleTestRepo(True) repo2 = _createEmptyTestRepo(True) repo.addremote("myremote", repo2.url) repo2.addremote("myremote", repo.url) repo.push("myremote", "master") filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = repo.HEAD) layer = loadLayerNoCrsDialog(filename, "points", "ogr") idx = layer.dataProvider().fieldNameIndex("n") features = list(layer.getFeatures()) with edit(layer): layer.changeAttributeValue(features[0].id(), idx, 1000) layer.changeAttributeValue(features[1].id(), idx, 2000) _, _, conflicts, _ = repo.importgeopkg(layer, "master", "message", "me", "*****@*****.**", True) filename2 = tempFilename("gpkg") repo2.checkoutlayer(filename2, "points", ref = repo.HEAD) layer2 = loadLayerNoCrsDialog(filename2, "points", "ogr") features = list(layer2.getFeatures()) with edit(layer2): layer2.changeAttributeValue(features[0].id(), idx, 1001) layer2.changeAttributeValue(features[1].id(), idx, 2001) _, _, conflicts, _ = repo2.importgeopkg(layer2, "master", "message2", "me", "*****@*****.**", True) conflicts = repo2.pull("myremote", "master") self.assertEqual(2, len(conflicts))
def _createSimpleTestRepo(modifiesRepo=True, group=None, name=None): conf.update([(k, os.getenv(k)) for k in conf if k in os.environ]) if modifiesRepo: repo = createRepoAtUrl(conf['REPOS_SERVER_URL'], group or "test", name or "simple_%s" % str(time.time())) else: global simpleTestRepo if simpleTestRepo is not None: return simpleTestRepo try: simpleTestRepo = createRepoAtUrl(conf['REPOS_SERVER_URL'], group or "test", name or "original_simple") except GeoGigException: simpleTestRepo = Repository( conf['REPOS_SERVER_URL'] + "repos/original_simple/", group or "test", name or "original_simple") return simpleTestRepo repo = simpleTestRepo _importLayerToRepo(repo, "first") log = repo.log() filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref=log[0].commitid) layer = loadLayerNoCrsDialog(filename, "points", "ogr") with edit(layer): feat = QgsFeature() feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(10, 10))) feat.setAttributes([3, 2]) layer.addFeatures([feat]) repo.importgeopkg(layer, "master", "second", "tester", "*****@*****.**", True) log = repo.log() filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref=log[0].commitid) layer = loadLayerNoCrsDialog(filename, "points", "ogr") features = list(layer.getFeatures()) for feature in features: pt = feature.geometry().asPoint() if pt.x() == 10 and pt.y() == 10: featureid = feature.id() break with edit(layer): layer.changeGeometry(featureid, QgsGeometry.fromPoint(QgsPoint(5, 5))) repo.importgeopkg(layer, "master", "third", "tester", "*****@*****.**", True) repo.createbranch(repo.HEAD, "mybranch") repo.createtag(repo.HEAD, "mytag") global _lastRepo _lastRepo = repo return _lastRepo
def _createWithMergeTestRepo(modifiesRepo=True): conf.update([(k, os.getenv(k)) for k in conf if k in os.environ]) if modifiesRepo: repo = createRepoAtUrl(conf['REPOS_SERVER_URL'], "test", "withmerge_%s" % str(time.time())) else: global withMergeTestRepo if withMergeTestRepo is not None: return withMergeTestRepo try: withMergeTestRepo = createRepoAtUrl(conf['REPOS_SERVER_URL'], "test", "original_withmerge") except GeoGigException: withMergeTestRepo = Repository( conf['REPOS_SERVER_URL'] + "repos/original_withmerge/", "test", "original_withmerge") return withMergeTestRepo repo = withMergeTestRepo _importLayerToRepo(repo, "first") repo.createbranch(repo.HEAD, "mybranch") filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref=repo.HEAD) layer = loadLayerNoCrsDialog(filename, "points", "ogr") with edit(layer): feat = QgsFeature() feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(10, 10))) feat.setAttributes([3, 2]) layer.addFeatures([feat]) repo.importgeopkg(layer, "mybranch", "second", "tester", "*****@*****.**", True) filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref=repo.HEAD) layer = loadLayerNoCrsDialog(filename, "points", "ogr") with edit(layer): feat = QgsFeature() feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(9, 9))) feat.setAttributes([9, 9]) layer.addFeatures([feat]) repo.importgeopkg(layer, "master", "second", "tester", "*****@*****.**", True) repo.merge("mybranch", "master") global _lastRepo _lastRepo = repo return _lastRepo
def layerAdded(qgislayer): try: if qgislayer.providerType().lower() != "wfs": return except: pass #Not all layers have a providerType method catalogs = list(_explorer.explorerTree.gsItem._catalogs.values()) for cat in catalogs: if cat.layersEndpointUrl() in qgislayer.source(): for layer in cat.get_layers(): uri = uri_utils.layerUri(layer) if uri == qgislayer.source(): try: sld = layer.default_style.sld_body.decode() sld = adaptGsToQgs(sld) sldfile = tempFilename("sld") with open(sldfile, 'w') as f: f.write(sld) msg, ok = qgislayer.loadSldStyle(sldfile) if not ok: raise Exception("Could not load style for layer <b>%s</b>" % qgislayer.name()) qgislayer.styleChanged.connect(partial(updatePublishedStyle, qgislayer)) except Exception as e: setWarning("Could not set style for layer <b>%s</b>" % qgislayer.name()) return
def layerAdded(qgislayer): try: qgislayer.styleChanged.connect(partial(updatePublishedStyle, qgislayer)) except: #styleChanged only available for QGIS >2.16 pass try: if qgislayer.providerType().lower() != "wfs": return except: pass #Not all layers have a providerType method catalogs = _explorer.explorerTree.gsItem._catalogs.values() for cat in catalogs: if cat.gs_base_url in qgislayer.source(): for layer in cat.get_layers(): uri = uri_utils.layerUri(layer) if uri == qgislayer.source(): try: sld = layer.default_style.sld_body sld = adaptGsToQgs(sld) sldfile = tempFilename("sld") with open(sldfile, 'w') as f: f.write(sld) msg, ok = qgislayer.loadSldStyle(sldfile) if not ok: raise Exception("Could not load style for layer <b>%s</b>" % qgislayer.name()) except Exception, e: _explorer.setWarning("Could not set style for layer <b>%s</b>" % qgislayer.name()) break
def testLayerCommitId(self): repo = _createSimpleTestRepo(True) log = repo.log() filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = log[1].commitid) layer = loadLayerNoCrsDialog(filename, "points", "ogr") self.assertTrue(log[1].commitid, getCommitId(layer))
def layerAdded(qgislayer): try: if qgislayer.providerType().lower() != "wfs": return except: pass #Not all layers have a providerType method catalogs = list(_explorer.explorerTree.gsItem._catalogs.values()) for cat in catalogs: if cat.layersEndpointUrl() in qgislayer.source(): for layer in cat.get_layers(): uri = uri_utils.layerUri(layer) if uri == qgislayer.source(): try: sld = layer.default_style.sld_body.decode() sldfile = tempFilename("sld") with open(sldfile, 'w') as f: f.write(sld) msg, ok = qgislayer.loadSldStyle(sldfile) if not ok: raise Exception( "Could not load style for layer <b>%s</b>" % qgislayer.name()) qgislayer.styleChanged.connect( partial(updatePublishedStyle, qgislayer)) except Exception as e: setWarning("Could not set style for layer <b>%s</b>" % qgislayer.name()) return
def layerFile(self, extent=None): if extent in self._files: return self._files[extent] else: filename = tempFilename("tif") self._save(filename, extent) self._files[extent] = filename return filename
def _createSimpleTestRepo(modifiesRepo = True, group=None, name=None): conf.update([(k, os.getenv(k)) for k in conf if k in os.environ]) if modifiesRepo: repo = createRepoAtUrl(conf['REPOS_SERVER_URL'], group or "test", name or "simple_%s" % str(time.time())) else: global simpleTestRepo if simpleTestRepo is not None: return simpleTestRepo try: simpleTestRepo = createRepoAtUrl(conf['REPOS_SERVER_URL'], group or "test", name or "original_simple") except GeoGigException: simpleTestRepo = Repository(conf['REPOS_SERVER_URL'] + "repos/original_simple/", group or "test", name or "original_simple") return simpleTestRepo repo = simpleTestRepo _importLayerToRepo(repo, "first") log = repo.log() filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = log[0].commitid) layer = loadLayerNoCrsDialog(filename, "points", "ogr") with edit(layer): feat = QgsFeature() feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(10, 10))) feat.setAttributes([3, 2]) layer.addFeatures([feat]) repo.importgeopkg(layer, "master", "second", "tester", "*****@*****.**", True) log = repo.log() filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = log[0].commitid) layer = loadLayerNoCrsDialog(filename, "points", "ogr") features = list(layer.getFeatures()) for feature in features: pt = feature.geometry().asPoint() if pt.x() == 10 and pt.y()== 10: featureid = feature.id() break with edit(layer): layer.changeGeometry(featureid, QgsGeometry.fromPoint(QgsPoint(5, 5))) repo.importgeopkg(layer, "master", "third", "tester", "*****@*****.**", True) repo.createbranch(repo.HEAD, "mybranch") repo.createtag(repo.HEAD, "mytag") global _lastRepo _lastRepo = repo return _lastRepo
def _doConflictImport(layername = "points"): filename = tempFilename("gpkg") tests._lastRepo.checkoutlayer(filename, layername) layer = loadLayerNoCrsDialog(filename, layername, "ogr") idx = layer.dataProvider().fieldNameIndex("n") features = list(layer.getFeatures()) with edit(layer): layer.changeAttributeValue(features[0].id(), idx, 1001) tests._lastRepo.importgeopkg(layer, "master", "changed_%s_2" % layername, "me", "*****@*****.**", True)
def _doConflictImport(layername="points"): filename = tempFilename("gpkg") tests._lastRepo.checkoutlayer(filename, layername) layer = loadLayerNoCrsDialog(filename, layername, "ogr") idx = layer.dataProvider().fieldNameIndex("n") features = list(layer.getFeatures()) with edit(layer): layer.changeAttributeValue(features[0].id(), idx, 1001) tests._lastRepo.importgeopkg(layer, "master", "changed_%s_2" % layername, "me", "*****@*****.**", True)
def _createCannotPushScenario(): _createPushScenario() filename = tempFilename("gpkg") _remoteRepo.checkoutlayer(filename, "points") layer = loadLayerNoCrsDialog(filename, "points", "ogr") idx = layer.dataProvider().fieldNameIndex("n") features = list(layer.getFeatures()) with edit(layer): layer.changeAttributeValue(features[1].id(), idx, 1001) _remoteRepo.importgeopkg(layer, "master", "message", "me", "*****@*****.**", True)
def _createWithMergeTestRepo(modifiesRepo = True): conf.update([(k, os.getenv(k)) for k in conf if k in os.environ]) if modifiesRepo: repo = createRepoAtUrl(conf['REPOS_SERVER_URL'], "test", "withmerge_%s" % str(time.time())) else: global withMergeTestRepo if withMergeTestRepo is not None: return withMergeTestRepo try: withMergeTestRepo = createRepoAtUrl(conf['REPOS_SERVER_URL'], "test", "original_withmerge") except GeoGigException: withMergeTestRepo = Repository(conf['REPOS_SERVER_URL'] + "repos/original_withmerge/", "test", "original_withmerge") return withMergeTestRepo repo = withMergeTestRepo _importLayerToRepo(repo, "first") repo.createbranch(repo.HEAD, "mybranch") filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = repo.HEAD) layer = loadLayerNoCrsDialog(filename, "points", "ogr") with edit(layer): feat = QgsFeature() feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(10, 10))) feat.setAttributes([3, 2]) layer.addFeatures([feat]) repo.importgeopkg(layer, "mybranch", "second", "tester", "*****@*****.**", True) filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = repo.HEAD) layer = loadLayerNoCrsDialog(filename, "points", "ogr") with edit(layer): feat = QgsFeature() feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(9, 9))) feat.setAttributes([9, 9]) layer.addFeatures([feat]) repo.importgeopkg(layer, "master", "second", "tester", "*****@*****.**", True) repo.merge("mybranch", "master") global _lastRepo _lastRepo = repo return _lastRepo
def testDownloadNonHead(self): repo = _createSimpleTestRepo() log = repo.log() self.assertEqual(3, len(log)) commitid = log[-1].commitid filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = commitid) layer = loadLayerNoCrsDialog(filename, "points", "ogr") self.assertTrue(layer.isValid()) features = list(layer.getFeatures()) self.assertEqual(1, len(features))
def testResolveConflictWithNewFeature(self): repo, conflicts = self._createConflict() conflicts[0].resolveWithNewFeature({"fid": 1, "n": 1002}) conflicts[1].resolveWithRemoteVersion() repo.commitAndCloseMergeAndTransaction("user", "*****@*****.**", "conflict resolution", conflicts[0].transactionId) self.assertTrue("conflict resolution" in repo.log()[0].message) filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = repo.HEAD) layer = loadLayerNoCrsDialog(filename, "points", "ogr") features = list(layer.getFeatures()) self.assertTrue([1, 1002], features[0].attributes()) self.assertTrue([2, 2000], features[1].attributes())
def _exportAndCreateConflictWithRemoveAndModify(): layer = checkoutLayer(tests._lastRepo, "points", None) idx = layer.dataProvider().fieldNameIndex("n") features = list(layer.getFeatures()) with edit(layer): layer.deleteFeatures([features[0].id()]) filename = tempFilename("gpkg") tests._lastRepo.checkoutlayer(filename, "points") layer2 = loadLayerNoCrsDialog(filename, "points2", "ogr") features2 = list(layer2.getFeatures()) with edit(layer2): layer2.changeAttributeValue(features[0].id(), idx, 1000) _, _, conflicts, _ = tests._lastRepo.importgeopkg(layer2, "master", "message", "me", "*****@*****.**", True)
def testImportInterchangeFormat(self): repo = _createSimpleTestRepo(True) filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points") layer = loadLayerNoCrsDialog(filename, "points", "ogr") self.assertTrue(layer.isValid()) features = list(layer.getFeatures()) self.assertEqual(2, len(features)) with edit(layer): layer.deleteFeatures([features[0].id()]) features = list(layer.getFeatures()) self.assertEqual(1, len(features)) repo.importgeopkg(layer, "master", "message", "me", "*****@*****.**", True) log = repo.log() self.assertEqual("message", log[0].message) self.assertEqual(["points"], repo.trees()) filename2 = tempFilename("gpkg") repo.checkoutlayer(filename2, "points") layer2 = loadLayerNoCrsDialog(filename, "points2", "ogr") self.assertTrue(layer2.isValid()) features2 = list(layer2.getFeatures()) self.assertEqual(1, len(features2))
def addLayerToProject(self, name, destName=None): ''' Adds a new layer to the current project based on a layer in a GeoServer catalog It will create a new layer with a WFS or WCS connection, pointing to the specified GeoServer layer. In the case of a vector layer, it will also fetch its associated style and set it as the current style for the created QGIS layer ''' layer = self.catalog.get_layer(name) if layer is None: raise Exception("A layer with the name '" + name + "' was not found in the catalog") resource = layer.resource uri = uri_utils.layerUri(layer) QgsNetworkAccessManager.instance().cache().clear() if resource.resource_type == "featureType": qgslayer = QgsVectorLayer(uri, destName or resource.title, "WFS") if not qgslayer.isValid(): raise Exception("Layer at %s is not a valid layer" % uri) ok = True try: sld = layer.default_style.sld_body.decode() sld = adaptGsToQgs(str(sld)) sldfile = tempFilename("sld") with open(sldfile, 'w') as f: f.write(sld) msg, ok = qgslayer.loadSldStyle(sldfile) except Exception as e: ok = False QgsProject.instance().addMapLayers([qgslayer]) setUnits(qgslayer) addTrackedLayer(qgslayer, self.catalog.service_url) if not ok: raise Exception( "Layer was added, but style could not be set (maybe GeoServer layer is missing default style)" ) elif resource.resource_type == "coverage": qgslayer = QgsRasterLayer(uri, destName or resource.title, "wcs") if not qgslayer.isValid(): raise Exception("Layer at %s is not a valid layer" % uri) QgsProject.instance().addMapLayers([qgslayer]) addTrackedLayer(qgslayer, self.catalog.service_url) elif resource.resource_type == "wmsLayer": qgslayer = QgsRasterLayer(uri, destName or resource.title, "wms") if not qgslayer.isValid(): raise Exception("Layer at %s is not a valid layer" % uri) QgsProject.instance().addMapLayers([qgslayer]) addTrackedLayer(qgslayer, self.catalog.service_url) else: raise Exception("Cannot add layer. Unsupported layer type.")
def createSimpleTestRepo(group=None, name=None): repo = createRepoAtUrl(REPOS_SERVER_URL, group or "Lesson repos", name or "simple_%s" % str(time.time())) _importLayerToRepo(repo, "first") log = repo.log() filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref=log[0].commitid) layer = QgsVectorLayer(filename, "points", "ogr") with edit(layer): feat = QgsFeature() feat.setGeometry(QgsGeometry.fromPoint(QgsPoint(10, 10))) feat.setAttributes([3, 2]) layer.addFeatures([feat]) repo.importgeopkg(layer, "master", "second", "tester", "*****@*****.**", True) log = repo.log() filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref=log[0].commitid) layer = QgsVectorLayer(filename, "points", "ogr") features = list(layer.getFeatures()) for feature in features: pt = feature.geometry().asPoint() if pt.x() == 10 and pt.y() == 10: featureid = feature.id() break with edit(layer): layer.changeGeometry(featureid, QgsGeometry.fromPoint(QgsPoint(5, 5))) repo.importgeopkg(layer, "master", "third", "tester", "*****@*****.**", True) repo.createbranch(repo.HEAD, "mybranch") repo.createtag(repo.HEAD, "mytag") global _lastRepo _lastRepo = repo return _lastRepo
def _exportAndCreateConflictWithNulls(): layer = checkoutLayer(tests._lastRepo, "points", None) idx = layer.dataProvider().fieldNameIndex("n") features = list(layer.getFeatures()) with edit(layer): layer.changeGeometry(features[0].id(), QgsGeometry.fromPoint(QgsPoint(123, 456))) layer.changeAttributeValue(features[0].id(), idx, None) filename = tempFilename("gpkg") tests._lastRepo.checkoutlayer(filename, "points") layer2 = loadLayerNoCrsDialog(filename, "points2", "ogr") features2 = list(layer2.getFeatures()) with edit(layer2): layer2.changeGeometry(features[0].id(), QgsGeometry.fromPoint(QgsPoint(124, 457))) layer2.changeAttributeValue(features2[0].id(), idx, None) _, _, conflicts, _ = tests._lastRepo.importgeopkg(layer2, "master", "message", "me", "*****@*****.**", True)
def addLayerToProject(self, name, destName = None): ''' Adds a new layer to the current project based on a layer in a GeoServer catalog It will create a new layer with a WFS or WCS connection, pointing to the specified GeoServer layer. In the case of a vector layer, it will also fetch its associated style and set it as the current style for the created QGIS layer ''' layer = self.catalog.get_layer(name) if layer is None: raise Exception ("A layer with the name '" + name + "' was not found in the catalog") resource = layer.resource uri = uri_utils.layerUri(layer) QgsNetworkAccessManager.instance().cache().clear() if resource.resource_type == "featureType": qgslayer = QgsVectorLayer(uri, destName or resource.title, "WFS") if not qgslayer.isValid(): raise Exception ("Layer at %s is not a valid layer" % uri) ok = True try: sld = layer.default_style.sld_body.decode() sld = adaptGsToQgs(str(sld)) sldfile = tempFilename("sld") with open(sldfile, 'w') as f: f.write(sld) msg, ok = qgslayer.loadSldStyle(sldfile) except Exception as e: ok = False QgsProject.instance().addMapLayers([qgslayer]) setUnits(qgslayer) addTrackedLayer(qgslayer, self.catalog.service_url) if not ok: raise Exception ("Layer was added, but style could not be set (maybe GeoServer layer is missing default style)") elif resource.resource_type == "coverage": qgslayer = QgsRasterLayer(uri, destName or resource.title, "wcs" ) if not qgslayer.isValid(): raise Exception ("Layer at %s is not a valid layer" % uri) QgsProject.instance().addMapLayers([qgslayer]) addTrackedLayer(qgslayer, self.catalog.service_url) elif resource.resource_type == "wmsLayer": qgslayer = QgsRasterLayer(uri, destName or resource.title, "wms") if not qgslayer.isValid(): raise Exception ("Layer at %s is not a valid layer" % uri) QgsProject.instance().addMapLayers([qgslayer]) addTrackedLayer(qgslayer, self.catalog.service_url) else: raise Exception("Cannot add layer. Unsupported layer type.")
def testImportWithNullValue(self): repo = _createSimpleTestRepo(True) filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points") layer = loadLayerNoCrsDialog(filename, "points", "ogr") self.assertTrue(layer.isValid()) features = list(layer.getFeatures()) self.assertEqual(2, len(features)) idx = layer.dataProvider().fieldNameIndex("n") features = list(layer.getFeatures()) with edit(layer): layer.changeGeometry(features[0].id(), QgsGeometry.fromPoint(QgsPoint(123, 456))) layer.changeAttributeValue(features[0].id(), idx, None) repo.importgeopkg(layer, "master", "message", "me", "*****@*****.**", True) log = repo.log() self.assertEqual("message", log[0].message)
def _createPullScenario(): global _remoteRepo _remoteRepo = _createEmptyTestRepo(True) global _localRepo _localRepo = _createSimpleTestRepo(True) _localRepo.addremote("myremote", _remoteRepo.url) _remoteRepo.addremote("myremote", _localRepo.url) _localRepo.push("myremote", "master") filename = tempFilename("gpkg") _remoteRepo.checkoutlayer(filename, "points") layer = loadLayerNoCrsDialog(filename, "points", "ogr") idx = layer.dataProvider().fieldNameIndex("n") features = list(layer.getFeatures()) with edit(layer): layer.changeAttributeValue(features[0].id(), idx, 1001) _remoteRepo.importgeopkg(layer, "master", "message2", "me", "*****@*****.**", True)
def testChangeVersion(self): repo = _createSimpleTestRepo() log = repo.log() self.assertEqual(3, len(log)) commitid = log[-1].commitid filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref=commitid) layer = loadLayerNoCrsDialog(filename, "points", "ogr") self.assertTrue(layer.isValid()) features = list(layer.getFeatures()) self.assertEqual(1, len(features)) applyLayerChanges(repo, layer, commitid, repo.HEAD) layer.reload() self.assertTrue(layer.isValid()) features = list(layer.getFeatures()) self.assertEqual(2, len(features)) self.assertEqual(getCommitId(layer), log[0].commitid)
def testChangeVersion(self): repo = _createSimpleTestRepo() log = repo.log() self.assertEqual(3, len(log)) commitid = log[-1].commitid filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points", ref = commitid) layer = loadLayerNoCrsDialog(filename, "points", "ogr") self.assertTrue(layer.isValid()) features = list(layer.getFeatures()) self.assertEqual(1, len(features)) applyLayerChanges(repo, layer, commitid, repo.HEAD) layer.reload() self.assertTrue(layer.isValid()) features = list(layer.getFeatures()) self.assertEqual(2, len(features)) self.assertEqual(getCommitId(layer), log[0].commitid)
def testCanCleanAuditTableAfterEdit(self): src = os.path.join(os.path.dirname(__file__), "data", "layers", "points.gpkg") dest = tempFilename("gpkg") shutil.copy(src, dest) layer = loadLayerNoCrsDialog(dest, "points", "ogr") self.assertTrue(layer.isValid()) features = list(layer.getFeatures()) geom = QgsGeometry.fromPoint(QgsPoint(12, 12)) self.assertTrue(layer.startEditing()) self.assertTrue(layer.changeGeometry(features[0].id(), geom)) self.assertTrue(layer.commitChanges()) con = sqlite3.connect(dest) cursor = con.cursor() cursor.execute("DELETE FROM points_audit;") self.assertRaises(OperationalError, con.commit) con.close() layer.reload() con = sqlite3.connect(dest) cursor = con.cursor() cursor.execute("DELETE FROM points_audit;") con.commit()
def addDiffLayers(repo, commit, commit2, layernames): styles = [diffStylePoints, diffStyleLines, diffStylePolygons] geomTypes = ["Point","LineString","Polygon"] beforeFilename = tempFilename("gpkg") repo.exportdiff(commit.commitid, commit2.commitid, beforeFilename) afterFilename = tempFilename("gpkg") repo.exportdiff(commit2.commitid, commit.commitid, afterFilename) for layername in layernames: styles = [diffStylePoints, diffStyleLines, diffStylePolygons] geomTypes = ["Point","LineString","Polygon"] beforeLayer = loadLayerNoCrsDialog("%s|layername=%s" % (beforeFilename, layername), layername, "ogr") afterLayer = loadLayerNoCrsDialog("%s|layername=%s" % (afterFilename, layername), layername, "ogr") beforeCon = sqlite3.connect(beforeFilename) beforeCursor = beforeCon.cursor() afterCon = sqlite3.connect(afterFilename) afterCursor = afterCon.cursor() attributes = [v[1] for v in beforeCursor.execute("PRAGMA table_info('%s');" % layername)] attrnames = [f.name() for f in beforeLayer.pendingFields()] layerFeatures = [] beforeCursor.execute("SELECT * FROM %s_changes WHERE audit_op=2;" % layername) modified = beforeCursor.fetchall() for m in modified: geogigfid = m[0] beforeGpkgfid = gpkgfidFromGeogigfid(beforeCursor, layername, geogigfid) beforeCursor.execute("SELECT * FROM %s WHERE fid='%s';" % (layername, beforeGpkgfid)) featureRow = beforeCursor.fetchone() attrs = {attr: featureRow[attributes.index(attr)] for attr in attrnames} attrs["changetype"] = MODIFIED_BEFORE request = QgsFeatureRequest() request.setFilterFid(beforeGpkgfid) feature = next(beforeLayer.getFeatures(request)) layerFeatures.append({"attrs":attrs, "geom": QgsGeometry(feature.geometry())}) afterGpkgfid = gpkgfidFromGeogigfid(afterCursor, layername, geogigfid) afterCursor.execute("SELECT * FROM %s WHERE fid='%s';" % (layername,afterGpkgfid)) featureRow = afterCursor.fetchone() attrs = {attr: featureRow[attributes.index(attr)] for attr in attrnames} attrs["changetype"] = MODIFIED_AFTER request = QgsFeatureRequest() request.setFilterFid(afterGpkgfid) feature = next(afterLayer.getFeatures(request)) layerFeatures.append({"attrs":attrs, "geom": QgsGeometry(feature.geometry())}) afterCursor.execute("SELECT * FROM %s_changes WHERE audit_op=1;" % layername) added = afterCursor.fetchall() for a in added: geogigfid = a[0] afterGpkgfid = gpkgfidFromGeogigfid(afterCursor, layername, geogigfid) afterCursor.execute("SELECT * FROM %s WHERE fid='%s';" % (layername, afterGpkgfid)) featureRow = afterCursor.fetchone() attrs = {attr: featureRow[attributes.index(attr)] for attr in attrnames} attrs["changetype"] = ADDED request = QgsFeatureRequest() request.setFilterFid(afterGpkgfid) feature = next(afterLayer.getFeatures(request)) layerFeatures.append({"attrs":attrs, "geom": QgsGeometry(feature.geometry())}) beforeCursor.execute("SELECT * FROM %s_changes WHERE audit_op=1;" % layername) removed = beforeCursor.fetchall() for r in removed: geogigfid = r[0] beforeGpkgfid = gpkgfidFromGeogigfid(beforeCursor, layername, geogigfid) beforeCursor.execute("SELECT * FROM %s WHERE fid='%s';" % (layername, beforeGpkgfid)) featureRow = beforeCursor.fetchone() attrs = {attr: featureRow[attributes.index(attr)] for attr in attrnames} attrs["changetype"] = REMOVED request = QgsFeatureRequest() request.setFilterFid(beforeGpkgfid) feature = next(beforeLayer.getFeatures(request)) layerFeatures.append({"attrs":attrs, "geom": QgsGeometry(feature.geometry())}) if layerFeatures: attrnames.append("changetype") uriFields = "&".join(["field=%s" % f for f in attrnames]) uri = "%s?crs=%s&%s" % (geomTypes[beforeLayer.geometryType()], beforeLayer.crs().authid(), uriFields) layer = QgsVectorLayer(uri, "%s(diff)" % layername, "memory") featuresList = [] for feature in layerFeatures: qgsfeature = QgsFeature() qgsfeature.setGeometry(feature["geom"]) qgsfeature.setAttributes([feature["attrs"][attr] for attr in attrnames]) featuresList.append(qgsfeature) layer.dataProvider().addFeatures(featuresList) layer.updateExtents() QgsMapLayerRegistry.instance().addMapLayers([layer]) layer.loadNamedStyle(styles[layer.geometryType()])
def applyLayerChanges(repo, layer, beforeCommitId, afterCommitId, clearAudit=True): layer.reload() filename, layername = namesFromLayer(layer) changesFilename = tempFilename("gpkg") beforeCommitId, afterCommitId = repo.revparse( beforeCommitId), repo.revparse(afterCommitId) repo.exportdiff(beforeCommitId, afterCommitId, changesFilename, layername) con = sqlite3.connect(filename) cursor = con.cursor() changesCon = sqlite3.connect(changesFilename) changesCursor = changesCon.cursor() attributes = [ v[1] for v in cursor.execute("PRAGMA table_info('%s');" % layername) ] attrnames = [a for a in attributes if a != "fid"] changesCursor.execute("SELECT * FROM %s_changes WHERE audit_op=2;" % layername) modified = changesCursor.fetchall() for m in modified: geogigfid = m[0] changesGpkgfid = gpkgfidFromGeogigfid(changesCursor, layername, geogigfid) gpkgfid = gpkgfidFromGeogigfid(cursor, layername, geogigfid) changesCursor.execute("SELECT * FROM %s WHERE fid='%s';" % (layername, changesGpkgfid)) featureRow = changesCursor.fetchone() attrs = { attr: featureRow[attributes.index(attr)] for attr in attrnames } vals = ",".join(['"%s"=?' % k for k in list(attrs.keys())]) cursor.execute( "UPDATE %s SET %s WHERE fid='%s'" % (layername, vals, gpkgfid), list(attrs.values())) changesCursor.execute("SELECT * FROM %s_changes WHERE audit_op=1;" % layername) added = changesCursor.fetchall() for a in added: geogigfid = a[0] changesGpkgfid = gpkgfidFromGeogigfid(changesCursor, layername, geogigfid) changesCursor.execute("SELECT * FROM %s WHERE fid='%s';" % (layername, changesGpkgfid)) featureRow = changesCursor.fetchone() attrs = { attr: featureRow[attributes.index(attr)] for attr in attrnames } cols = ', '.join('"%s"' % col for col in list(attrs.keys())) vals = ', '.join('?' for val in list(attrs.values())) cursor.execute( 'INSERT INTO "%s" (%s) VALUES (%s)' % (layername, cols, vals), list(attrs.values())) gpkgfid = cursor.lastrowid cursor.execute('INSERT INTO "%s_fids" VALUES ("%s", "%s")' % (layername, gpkgfid, geogigfid)) changesCursor.execute("SELECT * FROM %s_changes WHERE audit_op=3;" % layername) removed = changesCursor.fetchall() for r in removed: geogigfid = r[0] gpkgfid = gpkgfidFromGeogigfid(cursor, layername, geogigfid) cursor.execute("DELETE FROM %s WHERE fid='%s'" % (layername, gpkgfid)) changesCursor.close() changesCon.close() if clearAudit: cursor.execute("DELETE FROM %s_audit;" % layername) cursor.execute( "UPDATE geogig_audited_tables SET commit_id='%s' WHERE table_name='%s'" % (afterCommitId, layername)) con.commit() cursor.close() con.close()
def testDownload(self): repo = _createSimpleTestRepo() filename = tempFilename("gpkg") repo.checkoutlayer(filename, "points") layer = loadLayerNoCrsDialog(filename, "points", "ogr") self.assertTrue(layer.isValid())
def testExportDiff(self): repo = _createSimpleTestRepo() filename = tempFilename("gpkg") repo.exportdiff("HEAD", "HEAD~1", filename) self.assertTrue(os.path.exists(filename))
def _copyTestLayer(self): src = os.path.join(os.path.dirname(__file__), "data", "layers", "points.gpkg") dest = tempFilename("gpkg") shutil.copy(src, dest) return dest