Exemple #1
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
 def createLayers(self):
     types = [("Point", ptOursStyle, ptTheirsStyle),
               ("LineString", lineOursStyle, lineTheirsStyle),
               ("Polygon", polygonOursStyle, polygonTheirsStyle)]
     if self.oursgeom is not None:
         geomtype = types[int(self.oursgeom.type())][0]
         style = types[int(self.oursgeom.type())][1]
         self.oursLayer = loadLayerNoCrsDialog(geomtype + "?crs=EPSG:4326", "ours", "memory")
         pr = self.oursLayer.dataProvider()
         feat = QgsFeature()
         feat.setGeometry(self.oursgeom)
         pr.addFeatures([feat])
         self.oursLayer.loadNamedStyle(style)
         self.oursLayer.updateExtents()
         QgsMapLayerRegistry.instance().addMapLayer(self.oursLayer, False)
     else:
         self.oursLayer = None
     if self.theirsgeom is not None:
         geomtype = types[int(self.theirsgeom.type())][0]
         style = types[int(self.theirsgeom.type())][2]
         self.theirsLayer = loadLayerNoCrsDialog(geomtype + "?crs=EPSG:4326", "theirs", "memory")
         pr = self.theirsLayer.dataProvider()
         feat = QgsFeature()
         feat.setGeometry(self.theirsgeom)
         pr.addFeatures([feat])
         self.theirsLayer.loadNamedStyle(style)
         self.theirsLayer.updateExtents()
         QgsMapLayerRegistry.instance().addMapLayer(self.theirsLayer, False)
     else:
         self.theirsLayer = None
Exemple #3
0
 def createLayers(self):
     types = [("Point", ptOursStyle, ptTheirsStyle),
              ("LineString", lineOursStyle, lineTheirsStyle),
              ("Polygon", polygonOursStyle, polygonTheirsStyle)]
     if self.oursgeom is not None:
         geomtype = types[int(self.oursgeom.type())][0]
         style = types[int(self.oursgeom.type())][1]
         self.oursLayer = loadLayerNoCrsDialog(geomtype + "?crs=EPSG:4326",
                                               "ours", "memory")
         pr = self.oursLayer.dataProvider()
         feat = QgsFeature()
         feat.setGeometry(self.oursgeom)
         pr.addFeatures([feat])
         self.oursLayer.loadNamedStyle(style)
         self.oursLayer.updateExtents()
         QgsMapLayerRegistry.instance().addMapLayer(self.oursLayer, False)
     else:
         self.oursLayer = None
     if self.theirsgeom is not None:
         geomtype = types[int(self.theirsgeom.type())][0]
         style = types[int(self.theirsgeom.type())][2]
         self.theirsLayer = loadLayerNoCrsDialog(
             geomtype + "?crs=EPSG:4326", "theirs", "memory")
         pr = self.theirsLayer.dataProvider()
         feat = QgsFeature()
         feat.setGeometry(self.theirsgeom)
         pr.addFeatures([feat])
         self.theirsLayer.loadNamedStyle(style)
         self.theirsLayer.updateExtents()
         QgsMapLayerRegistry.instance().addMapLayer(self.theirsLayer, False)
     else:
         self.theirsLayer = None
Exemple #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))
Exemple #5
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)
Exemple #6
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
Exemple #7
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
Exemple #8
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 _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 _getLayers(self, changes):
        ADDED, MODIFIED, REMOVED,  = 0, 1, 2
        def _feature(g, changeType):
            feat = QgsFeature()
            if g is not None:
                feat.setGeometry(g)
            feat.setAttributes([changeType])
            return feat
        if changes:
            f = changes[0]
            new = f["new"]            
            old = f["old"]
            reference = new or old
            geomtype = QgsWkbTypes.displayString(reference.geometry().wkbType())
            oldLayer = loadLayerNoCrsDialog(geomtype + "?crs=epsg:4326&field=geogig.changeType:integer", "old", "memory")
            newLayer = loadLayerNoCrsDialog(geomtype + "?crs=epsg:4326&field=geogig.changeType:integer", "new", "memory")
            oldFeatures = []
            newFeatures = []
            for f in changes:            
                new = f["new"]        
                old = f["old"]                  
                newGeom = new.geometry() if new is not None else None
                oldGeom = old.geometry() if old is not None else None
                if oldGeom is None:
                    feature = _feature(newGeom, ADDED)
                    newFeatures.append(feature)
                elif newGeom is None:
                    feature = _feature(oldGeom, REMOVED)
                    oldFeatures.append(feature)
                elif oldGeom.asWkt() != newGeom.asWkt():
                    feature = _feature(oldGeom, MODIFIED)
                    oldFeatures.append(feature)
                    feature = _feature(newGeom, MODIFIED)
                    newFeatures.append(feature)
                else:
                    feature = _feature(newGeom, MODIFIED)
                    newFeatures.append(feature)
            oldLayer.dataProvider().addFeatures(oldFeatures)
            newLayer.dataProvider().addFeatures(newFeatures)
        else:
            oldLayer = None
            newLayer = None

        return oldLayer, newLayer
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)
Exemple #13
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 commitClicked(self):
        feature = self.listWidget.currentItem().feature
        geom = None
        self.attributesTable.setRowCount(len(feature))
        for idx, attrname in enumerate(feature):
            value = feature[attrname]
            font = QFont()
            font.setBold(True)
            font.setWeight(75)
            item = QTableWidgetItem(attrname)
            item.setFont(font)
            self.attributesTable.setItem(idx, 0, item);
            self.attributesTable.setItem(idx, 1, QTableWidgetItem(str(value)));
            if geom is None:
                try:
                    geom = QgsGeometry.fromWkt(value)
                except:
                    pass

        self.attributesTable.resizeRowsToContents()
        self.attributesTable.horizontalHeader().setMinimumSectionSize(150)
        self.attributesTable.horizontalHeader().setStretchLastSection(True)

        settings = QSettings()
        prjSetting = settings.value('/Projections/defaultBehaviour')
        settings.setValue('/Projections/defaultBehaviour', '')
        types = ["Point", "LineString", "Polygon"]
        layers = []
        if geom is not None:
            geomtype = types[int(geom.type())]
            layer = loadLayerNoCrsDialog(geomtype + "?crs=EPSG:4326", "temp", "memory")
            pr = layer.dataProvider()
            feat = QgsFeature()
            feat.setGeometry(geom)
            pr.addFeatures([feat])
            layer.updateExtents()
            layer.selectAll()
            layer.setExtent(layer.boundingBoxOfSelected())
            layer.invertSelection()
            symbol = QgsSymbolV2.defaultSymbol(layer.geometryType())
            symbol.setColor(Qt.green)
            symbol.setAlpha(0.5)
            if QGis.QGIS_VERSION_INT < 29900:
                layer.setRendererV2(QgsSingleSymbolRendererV2(symbol))
            else:
                layer.setRenderer(QgsSingleSymbolRenderer(symbol))
            self.mapCanvas.setRenderFlag(False)
            self.mapCanvas.setLayerSet([QgsMapCanvasLayer(layer)])
            QgsMapLayerRegistry.instance().addMapLayer(layer, False)
            self.mapCanvas.setExtent(layer.extent())
            self.mapCanvas.setRenderFlag(True)
            layers.append(layer)
        else:
            self.mapCanvas.setLayerSet([])
        settings.setValue('/Projections/defaultBehaviour', prjSetting)
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
Exemple #16
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)
Exemple #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))
Exemple #18
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())
Exemple #19
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))
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)
Exemple #21
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)
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)
Exemple #24
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)
Exemple #25
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)
Exemple #26
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)
Exemple #28
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)
Exemple #29
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()
Exemple #30
0
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:
        try:
            source = trackedlayer.source
            layer = QgsVectorLayer(source, layername, "ogr")
            assert layer.isValid()
        except:
            removeTrackedLayer(trackedlayer.source)
            trackedlayer = None
            filename = layerGeopackageFilename(layername, repo.title,
                                               repo.group)
            source = "%s|layername=%s" % (filename, layername)
    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 = layerFromSource(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 = layerFromSource(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
Exemple #31
0
 def testDownload(self):
     repo = _createSimpleTestRepo()
     filename = tempFilename("gpkg")
     repo.checkoutlayer(filename, "points")
     layer = loadLayerNoCrsDialog(filename, "points", "ogr")
     self.assertTrue(layer.isValid())
    def createLayers(self):
        textGeometries = []
        for geom in self.geoms:
            text = geom.exportToWkt()
            valid = " -1234567890.,"
            text = "".join([c for c in text if c in valid])
            textGeometries.append(text.split(","))
        lines = difflib.Differ().compare(textGeometries[0], textGeometries[1])
        self.data = []
        for line in lines:
            if line.startswith("+"):
                self.data.append([None, line[2:]])
            if line.startswith("-"):
                self.data.append([line[2:], None])
            if line.startswith(" "):
                self.data.append([line[2:], line[2:]])
        types = [("LineString", lineBeforeStyle, lineAfterStyle),
                  ("Polygon", polygonBeforeStyle, polygonAfterStyle)]
        layers = []
        extent = self.geoms[0].boundingBox()
        for i, geom in enumerate(self.geoms):
            geomtype = types[int(geom.type() - 1)][0]
            style = types[int(geom.type() - 1)][i + 1]
            layer = loadLayerNoCrsDialog(geomtype + "?crs=" + self.crs.authid(), "layer", "memory")
            pr = layer.dataProvider()
            feat = QgsFeature()
            feat.setGeometry(geom)
            pr.addFeatures([feat])
            layer.loadNamedStyle(style)
            layer.updateExtents()
            layers.append(layer)
            QgsMapLayerRegistry.instance().addMapLayer(layer, False)
            extent.combineExtentWith(geom.boundingBox())

        layer = loadLayerNoCrsDialog("Point?crs=%s&field=changetype:string" % self.crs.authid(), "points", "memory")
        pr = layer.dataProvider()
        feats = []
        for coords in self.data:
            coord = coords[0] or coords[1]
            feat = QgsFeature()
            x, y = coord.strip().split(" ")
            x, y = (float(x), float(y))
            pt = QgsGeometry.fromPoint(QgsPoint(x, y))
            feat.setGeometry(pt)
            if coords[0] is None:
                changetype = "A"
            elif coords[1] is None:
                changetype = "R"
            else:
                changetype = "U"
            feat.setAttributes([changetype])
            feats.append(feat)

        pr.addFeatures(feats)
        layer.loadNamedStyle(pointsStyle)
        QgsMapLayerRegistry.instance().addMapLayer(layer, False)
        layers.append(layer)

        self.mapLayers = [QgsMapCanvasLayer(lay) for lay in layers]
        self.canvas.setLayerSet(self.mapLayers)
        self.canvas.setExtent(extent)
        self.canvas.refresh()
Exemple #33
0
def _layer(name):
    return loadLayerNoCrsDialog(_layerPath(name), name, "ogr")
    def createLayers(self):
        textGeometries = []
        for geom in self.geoms:
            text = geom.exportToWkt()
            valid = " -1234567890.,"
            text = "".join([c for c in text if c in valid])
            textGeometries.append(text.split(","))
        lines = difflib.Differ().compare(textGeometries[0], textGeometries[1])
        self.data = []
        for line in lines:
            if line.startswith("+"):
                self.data.append([None, line[2:]])
            if line.startswith("-"):
                self.data.append([line[2:], None])
            if line.startswith(" "):
                self.data.append([line[2:], line[2:]])
        types = [("LineString", lineBeforeStyle, lineAfterStyle),
                 ("Polygon", polygonBeforeStyle, polygonAfterStyle)]
        layers = []
        extent = self.geoms[0].boundingBox()
        for i, geom in enumerate(self.geoms):
            geomtype = types[int(geom.type() - 1)][0]
            style = types[int(geom.type() - 1)][i + 1]
            layer = loadLayerNoCrsDialog(
                geomtype + "?crs=" + self.crs.authid(), "layer", "memory")
            pr = layer.dataProvider()
            feat = QgsFeature()
            feat.setGeometry(geom)
            pr.addFeatures([feat])
            layer.loadNamedStyle(style)
            layer.updateExtents()
            layers.append(layer)
            QgsMapLayerRegistry.instance().addMapLayer(layer, False)
            extent.combineExtentWith(geom.boundingBox())

        layer = loadLayerNoCrsDialog(
            "Point?crs=%s&field=changetype:string" % self.crs.authid(),
            "points", "memory")
        pr = layer.dataProvider()
        feats = []
        for coords in self.data:
            coord = coords[0] or coords[1]
            feat = QgsFeature()
            x, y = coord.strip().split(" ")
            x, y = (float(x), float(y))
            pt = QgsGeometry.fromPoint(QgsPoint(x, y))
            feat.setGeometry(pt)
            if coords[0] is None:
                changetype = "A"
            elif coords[1] is None:
                changetype = "R"
            else:
                changetype = "U"
            feat.setAttributes([changetype])
            feats.append(feat)

        pr.addFeatures(feats)
        layer.loadNamedStyle(pointsStyle)
        QgsMapLayerRegistry.instance().addMapLayer(layer, False)
        layers.append(layer)

        self.mapLayers = [QgsMapCanvasLayer(lay) for lay in layers]
        self.canvas.setLayerSet(self.mapLayers)
        self.canvas.setExtent(extent)
        self.canvas.refresh()
 def _getQgisTestLayer(self):
     dest = self._copyTestLayer()
     iface.newProject()
     layer = loadLayerNoCrsDialog(dest, "points", "ogr")
     QgsMapLayerRegistry.instance().addMapLayers([layer])
     return layer
Exemple #36
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()])
def _layer(name):
    return loadLayerNoCrsDialog(_layerPath(name), name, "ogr")