Example #1
0
 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
Example #3
0
 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
Example #4
0
 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))
Example #5
0
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
Example #6
0
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
Example #8
0
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
Example #9
0
 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)
Example #14
0
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
Example #17
0
 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))
Example #18
0
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)
Example #19
0
 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)
Example #21
0
 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))
Example #22
0
    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
Example #24
0
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 _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)
Example #26
0
    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.")
Example #27
0
 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)
Example #29
0
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)
Example #30
0
 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)
Example #32
0
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)
Example #33
0
 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()
Example #34
0
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()])
Example #35
0
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()
Example #36
0
 def testDownload(self):
     repo = _createSimpleTestRepo()
     filename = tempFilename("gpkg")
     repo.checkoutlayer(filename, "points")
     layer = loadLayerNoCrsDialog(filename, "points", "ogr")
     self.assertTrue(layer.isValid())
Example #37
0
 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