Beispiel #1
0
def CreateTestChangeset(user, tags=None, is_open=True, bbox=None):
    if tags is None:
        tags = {'foo': 'bar'}
    t = p.GetTransaction("EXCLUSIVE")
    cs = pgmap.PgChangeset()
    errStr = pgmap.PgMapError()
    for k in tags:
        cs.tags[k] = tags[k]
    cs.username = user.username
    cs.uid = user.id
    cs.is_open = is_open
    cs.open_timestamp = int(time.time())
    if not is_open:
        cs.close_timestamp = int(time.time())
    if bbox is not None:
        cs.bbox_set = True
        cs.x1 = bbox[0]
        cs.y1 = bbox[1]
        cs.x2 = bbox[2]
        cs.y2 = bbox[3]
    cid = t.CreateChangeset(cs, errStr)
    cs.objId = cid
    t.Commit()
    del t
    return cs
Beispiel #2
0
def close(request, changesetId):
    t = p.GetTransaction("EXCLUSIVE")

    changesetData = pgmap.PgChangeset()
    errStr = pgmap.PgMapError()
    ret = t.GetChangeset(int(changesetId), changesetData, errStr)
    if ret == -1:
        return HttpResponseNotFound("Changeset not found")
    if ret == 0:
        return HttpResponseServerError(errStr.errStr)

    if not changesetData.is_open:
        err = "The changeset {} was closed at {}.".format(
            changesetData.objId,
            datetime.datetime.fromtimestamp(
                changesetData.close_timestamp).isoformat())
        response = HttpResponse(err, content_type="text/plain")
        response.status_code = 409
        return response

    if request.user.id != changesetData.uid:
        return HttpResponse("This changeset belongs to a different user",
                            status=409,
                            content_type="text/plain")

    t.CloseChangeset(int(changesetId), int(time.time()), errStr)
    t.Commit()

    return SerializeChangesets([changesetData])
Beispiel #3
0
def create(request):

    userRecord = request.user

    changeset = pgmap.PgChangeset()
    errStr = pgmap.PgMapError()

    unicodeTags = {}
    csIn = request.data.find("changeset")
    for tag in csIn.findall("tag"):
        unicodeTags[tag.attrib["k"]] = tag.attrib["v"]
    if not CheckTags(unicodeTags):
        return HttpResponseBadRequest("Invalid tags")

    for tag in unicodeTags:
        changeset.tags[tag] = unicodeTags[tag]
    changeset.uid = request.user.id
    changeset.username = request.user.username

    t = p.GetTransaction("EXCLUSIVE")

    changeset.open_timestamp = int(time.time())

    cid = t.CreateChangeset(changeset, errStr)
    if cid == 0:
        t.Abort()
        return HttpResponseServerError(errStr.errStr)

    t.Commit()
    return HttpResponse(cid, content_type='text/plain')
Beispiel #4
0
    def test_expand_bbox(self):
        cs = CreateTestChangeset(self.user)

        response = self.client.post(reverse('changeset:expand_bbox',
                                            args=(cs.objId, )),
                                    self.expandBboxXml,
                                    content_type='text/xml')
        self.assertEqual(response.status_code, 200)

        t = p.GetTransaction("ACCESS SHARE")
        cs2 = pgmap.PgChangeset()
        errStr = pgmap.PgMapError()
        t.GetChangeset(cs.objId, cs2, errStr)

        self.assertEqual(cs2.bbox_set, True)
        self.assertEqual(abs(cs2.y1 - 50.2964626834) < 1e-5, True)
        self.assertEqual(abs(cs2.y2 - 51.7985258134) < 1e-5, True)
        self.assertEqual(abs(cs2.x1 + 5.24880409375) < 1e-5, True)
        self.assertEqual(abs(cs2.x2 + 3.08999061719) < 1e-5, True)

        xml = fromstring(response.content)
        self.assertEqual(xml.tag, "osm")
        csout = xml.find("changeset")
        self.assertEqual(int(csout.attrib["id"]) == cs.objId, True)
        self.assertEqual(
            abs(float(csout.attrib["min_lat"]) - 50.2964626834) < 1e-5, True)
        self.assertEqual(
            abs(float(csout.attrib["max_lat"]) - 51.7985258134) < 1e-5, True)
        self.assertEqual(
            abs(float(csout.attrib["min_lon"]) + 5.24880409375) < 1e-5, True)
        self.assertEqual(
            abs(float(csout.attrib["max_lon"]) + 3.08999061719) < 1e-5, True)

        t.Commit()
Beispiel #5
0
    def test_close_changeset_double_close(self):
        cs = CreateTestChangeset(self.user)

        response = self.client.put(
            reverse('changeset:close', args=(cs.objId, )))
        self.assertEqual(response.status_code, 200)

        t = p.GetTransaction("ACCESS SHARE")
        cs2 = pgmap.PgChangeset()
        errStr = pgmap.PgMapError()
        ret = t.GetChangeset(cs.objId, cs2, errStr)
        t.Commit()

        self.assertEqual(cs2.is_open, False)

        response = self.client.put(
            reverse('changeset:close', args=(cs.objId, )))
        self.assertEqual(response.status_code, 409)

        self.assertEqual(
            response.content.decode("UTF-8"),
            "The changeset {} was closed at {}.".format(
                cs2.objId,
                datetime.datetime.fromtimestamp(
                    cs2.close_timestamp).isoformat()))
Beispiel #6
0
def changeset(request, changesetId):
    include_discussion = request.GET.get('include_discussion',
                                         'false') == "true"

    if request.method == 'GET':
        t = p.GetTransaction("ACCESS SHARE")
    else:
        t = p.GetTransaction("EXCLUSIVE")

    changesetData = pgmap.PgChangeset()
    errStr = pgmap.PgMapError()
    ret = t.GetChangeset(int(changesetId), changesetData, errStr)
    if ret == -1:
        return HttpResponseNotFound("Changeset not found")
    if ret == 0:
        return HttpResponseServerError(errStr.errStr)

    if request.method == 'GET':
        t.Commit()

        return SerializeChangesets([changesetData], include_discussion)

    if request.method == 'PUT':

        if request.user.id != changesetData.uid:
            return HttpResponse("This changeset belongs to a different user",
                                status=409,
                                content_type="text/plain")

        if not changesetData.is_open:
            err = "The changeset {} was closed at {}.".format(
                changesetData.objId,
                datetime.datetime.fromtimestamp(
                    changesetData.close_timestamp).isoformat())
            response = HttpResponse(err, content_type="text/plain")
            response.status_code = 409
            return response

        unicodeTags = {}
        csIn = request.data.find("changeset")
        for tag in csIn.findall("tag"):
            unicodeTags[tag.attrib["k"]] = tag.attrib["v"]
        if not CheckTags(unicodeTags):
            return HttpResponseBadRequest("Invalid tags")

        changesetData.tags = pgmap.mapstringstring()
        for tag in unicodeTags:
            changesetData.tags[tag] = unicodeTags[tag]

        ok = t.UpdateChangeset(changesetData, errStr)
        if not ok:
            t.Abort()
            return HttpResponseServerError(errStr.errStr)

        t.Commit()

        return SerializeChangesets([changesetData])
Beispiel #7
0
def upload(request, changesetId):

    #Check changeset is open and for this user
    t = p.GetTransaction("EXCLUSIVE")

    changesetData = pgmap.PgChangeset()
    errStr = pgmap.PgMapError()
    ret = t.GetChangeset(int(changesetId), changesetData, errStr)
    if ret == -1:
        return HttpResponseNotFound("Changeset not found")
    if ret == 0:
        return HttpResponseServerError(errStr.errStr)

    if not changesetData.is_open:
        err = "The changeset {} was closed at {}.".format(
            changesetData.id, changesetData.close_datetime.isoformat())
        response = HttpResponse(err, content_type="text/plain")
        response.status_code = 409
        return response

    if request.user.id != changesetData.uid:
        return HttpResponse("This changeset belongs to a different user",
                            status=409,
                            content_type="text/plain")

    #Prepare diff result xml
    responseRoot = ET.Element('diffResult')
    doc = ET.ElementTree(responseRoot)
    responseRoot.attrib["version"] = str(settings.API_VERSION)
    responseRoot.attrib["generator"] = settings.GENERATOR

    createdNodeIds = pgmap.mapi64i64()
    createdWayIds = pgmap.mapi64i64()
    createdRelationIds = pgmap.mapi64i64()

    for i in range(request.data.blocks.size()):
        action = request.data.actions[i]
        block = request.data.blocks[i]
        ifunused = request.data.ifunused[i]
        timestamp = time.time()

        ret = upload_block(action, block, changesetId, t, responseRoot,
                           request.user.id, request.user.username, timestamp,
                           createdNodeIds, createdWayIds, createdRelationIds,
                           ifunused)
        if ret != True:
            print(ret)
            return ret

    t.Commit()

    sio = io.BytesIO()
    doc.write(
        sio,
        str("UTF-8"))  # str work around https://bugs.python.org/issue15811
    return HttpResponse(sio.getvalue(), content_type='text/xml')
Beispiel #8
0
def changeset(request, changesetId):
	t = p.GetTransaction("ACCESS SHARE")

	changeset = pgmap.PgChangeset()
	errStr = pgmap.PgMapError()
	ok = t.GetChangeset(int(changesetId), changeset, errStr)

	t.Commit()

	return render(request, 'objectinfo/changeset.html', {'changeset': changeset})
Beispiel #9
0
 def get_test_changeset(self, cid):
     t = p.GetTransaction("ACCESS SHARE")
     cs2 = pgmap.PgChangeset()
     errStr = pgmap.PgMapError()
     ret = t.GetChangeset(cid, cs2, errStr)
     t.Commit()
     if ret == 0:
         print(errStr)
     self.assertEqual(ret != 0, True)
     if ret == -1:
         raise KeyError("Changeset not found")
     return cs2
Beispiel #10
0
def upload_single_object(action, request, obj, objType, t):

    #Additional validate of input
    if (request.data.nodes.size() != (objType == "node")
            or request.data.ways.size() != (objType == "way")
            or request.data.relations.size() != (objType == "relation")):
        return HttpResponseBadRequest("Wrong number of objects")

    changesetId = obj.metaData.changeset

    #Check changeset is open and for this user
    changesetData = pgmap.PgChangeset()
    errStr = pgmap.PgMapError()
    ret = t.GetChangeset(int(changesetId), changesetData, errStr)
    if ret == -1:
        return HttpResponseNotFound("Changeset not found")
    if ret == 0:
        return HttpResponseServerError(errStr.errStr)

    if not changesetData.is_open:
        err = "The changeset {} was closed at {}.".format(
            changesetData.id,
            datetime.datetime.fromtimestamp(
                changesetData.close_timestamp).isoformat())
        response = HttpResponse(err, content_type="text/plain")
        response.status_code = 409
        return response

    if request.user.id != changesetData.uid:
        return HttpResponse("This changeset belongs to a different user",
                            status=409,
                            content_type="text/plain")

    #Prepare diff result xml
    responseRoot = ET.Element('diffResult')
    doc = ET.ElementTree(responseRoot)
    responseRoot.attrib["version"] = str(settings.API_VERSION)
    responseRoot.attrib["generator"] = settings.GENERATOR

    createdNodeIds = pgmap.mapi64i64()
    createdWayIds = pgmap.mapi64i64()
    createdRelationIds = pgmap.mapi64i64()

    timestamp = time.time()
    ret = upload_block("create", request.data, changesetId, t, responseRoot,
                       request.user.id, request.user.username, timestamp,
                       createdNodeIds, createdWayIds, createdRelationIds)
    if ret != True:
        return ret

    t.Commit()
    return True
Beispiel #11
0
	def test_close_changeset(self):
		cs = CreateTestChangeset(self.user)

		response = self.client.put(reverse('changeset:close', args=(cs.objId,)))
		self.assertEqual(response.status_code, 200)

		t = p.GetTransaction("ACCESS SHARE")
		cs2 = pgmap.PgChangeset()
		errStr = pgmap.PgMapError()
		ret = t.GetChangeset(cs.objId, cs2, errStr)
		t.Commit()
		self.assertEqual(ret != 0, True)
		self.assertEqual(cs2.is_open, False)
Beispiel #12
0
def expand_bbox(request, changesetId):
    t = p.GetTransaction("EXCLUSIVE")

    changesetData = pgmap.PgChangeset()
    errStr = pgmap.PgMapError()
    ret = t.GetChangeset(int(changesetId), changesetData, errStr)
    if ret == -1:
        return HttpResponseNotFound("Changeset not found")
    if ret == 0:
        return HttpResponseServerError(errStr.errStr)

    if request.user.id != changesetData.uid:
        return HttpResponse("This changeset belongs to a different user",
                            status=409,
                            content_type="text/plain")

    if not changesetData.is_open:
        err = "The changeset {} was closed at {}.".format(
            changesetData.objId,
            datetime.datetime.fromtimestamp(
                changesetData.close_timestamp).isoformat())
        response = HttpResponse(err, content_type="text/plain")
        response.status_code = 409
        return response

    for node in request.data.findall("node"):
        if not changesetData.bbox_set:
            changesetData.y1 = float(node.attrib["lat"])
            changesetData.y2 = float(node.attrib["lat"])
            changesetData.x1 = float(node.attrib["lon"])
            changesetData.x2 = float(node.attrib["lon"])
            changesetData.bbox_set = True
        else:
            if float(node.attrib["lat"]) < changesetData.y1:
                changesetData.y1 = float(node.attrib["lat"])
            if float(node.attrib["lat"]) > changesetData.y2:
                changesetData.y2 = float(node.attrib["lat"])
            if float(node.attrib["lon"]) < changesetData.x1:
                changesetData.x1 = float(node.attrib["lon"])
            if float(node.attrib["lon"]) > changesetData.x2:
                changesetData.x2 = float(node.attrib["lon"])

    ok = t.UpdateChangeset(changesetData, errStr)
    if not ok:
        t.Abort()
        return HttpResponseServerError(errStr.errStr)

    t.Commit()

    return SerializeChangesets([changesetData])