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
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])
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')
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()
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()))
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])
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')
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})
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
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
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)
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])