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 list_changesets(request): bbox = request.GET.get('bbox', None) #min_lon,min_lat,max_lon,max_lat user_uid = int(request.GET.get('user', 0)) display_name = request.GET.get('display_name', None) timearg = request.GET.get('time', None) openarg = request.GET.get('open', None) close = request.GET.get('closed', None) changesetsToGet = request.GET.get('changesets', None) #Check display_name or uid actually exists if display_name is not None: try: user = User.objects.get(username=display_name) user_uid = user.id except ObjectDoesNotExist: try: user = LegacyAccount.objects.get(username=display_name) user_uid = user.uid except ObjectDoesNotExist: return HttpResponseNotFound("User not found") changesets = pgmap.vectorchangeset() errStr = pgmap.PgMapError() t = p.GetTransaction("ACCESS SHARE") ok = t.GetChangesets(changesets, int(user_uid), errStr) t.Commit() changesetLi = [] for i in range(len(changesets)): changesetLi.append(changesets[i]) return SerializeChangesets(changesetLi)
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 getoscdiff(timebase, cat1, cat2, cat3): timenow = int(time.time()) epochts = int(time.mktime(settings.REPLICATE_EPOCH.timetuple())) if timebase == "minute": pageStep = 60000000 if timebase == "hour": pageStep = 60000000 * 60 if timebase == "day": pageStep = 60000000 * 60 * 24 pageStep2 = pageStep // 1000 pageStep3 = pageStep2 // 1000 pageStartTimestamp = ( int(cat1) - settings.REPLICATE_OFFSET ) * pageStep + int(cat2) * pageStep2 + int(cat3) * pageStep3 + epochts elapsedInPage = timenow - pageStartTimestamp if elapsedInPage < 0: return HttpResponseNotFound("Page does not exist") t = p.GetTransaction("EXCLUSIVE") osmc = pgmap.OsmChange() t.GetReplicateDiff(pageStartTimestamp - pageStep3, pageStartTimestamp, osmc) sio = io.BytesIO() pgmap.SaveToOsmChangeXml(osmc, False, pgmap.CPyOutbuf(sio)) return sio.getvalue()
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 create_relation(uid, username, refs, changeset=1000): relation = pgmap.OsmRelation() relation.objId = -1 relation.metaData.version = 1 relation.metaData.timestamp = 0 relation.metaData.changeset = changeset relation.metaData.uid = uid relation.metaData.username = username relation.metaData.visible = True relation.tags["test"] = "moon" for refTypeStr, refId, refRole in refs: relation.refTypeStrs.append(refTypeStr) relation.refIds.append(refId) relation.refRoles.append(refRole) data = pgmap.OsmData() data.relations.append(relation) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if not ok: t.Abort() print(errStr.errStr) return None else: t.Commit() relation.objId = createdRelationIds[-1] return relation
def modify_way(wayIn, refsIn, tagsIn, user, timestamp = None): way = pgmap.OsmWay() way.objId = wayIn.objId way.metaData.version = wayIn.metaData.version + 1 if timestamp is None: way.metaData.timestamp = int(time.time()) else: way.metaData.timestamp = int(timestamp) way.metaData.changeset = 1000 way.metaData.uid = user.id way.metaData.username = user.username way.metaData.visible = True for k in tagsIn: way.tags[k] = tagsIn[k] for ref in refsIn: way.refs.append(ref) data = pgmap.OsmData() data.ways.append(way) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if not ok: t.Abort() print (errStr.errStr) else: t.Commit() return ok, way
def getoscdiff(timebase, cat1, cat2, cat3): timenow = int(time.time()) epochts = int(time.mktime(settings.REPLICATE_EPOCH.timetuple())) if timebase == "minute": pageStep = 60000000 if timebase == "hour": pageStep = 60000000 * 60 if timebase == "day": pageStep = 60000000 * 60 * 24 pageStep2 = pageStep / 1000 pageStep3 = pageStep2 / 1000 pageStartTimestamp = int(cat1) * pageStep + int(cat2) * pageStep2 + int( cat3) * pageStep3 + epochts elapsedInPage = timenow - pageStartTimestamp if elapsedInPage < 0: return HttpResponseNotFound("Page does not exist") t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetReplicateDiff(pageStartTimestamp - pageStep3, pageStartTimestamp, osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return sio.getvalue()
def create_way(uid, username, refs, changeset = 1000, timestamp = None): way = pgmap.OsmWay() way.objId = -1 way.metaData.version = 1 if timestamp is None: way.metaData.timestamp = int(time.time()) else: way.metaData.timestamp = int(timestamp) way.metaData.changeset = changeset way.metaData.uid = uid way.metaData.username = username way.metaData.visible = True way.tags["test"] = "spring" for ref in refs: way.refs.append(ref) data = pgmap.OsmData() data.ways.append(way) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if not ok: t.Abort() print (errStr.errStr) return None else: t.Commit() way.objId = createdWayIds[-1] return way
def modify_relation(uid, username, relationIn, refsIn, tagsIn): relation = pgmap.OsmRelation() relation.objId = relationIn.objId relation.metaData.version = relationIn.metaData.version + 1 relation.metaData.timestamp = int(time.time()) relation.metaData.changeset = 1000 relation.metaData.uid = uid relation.metaData.username = username relation.metaData.visible = True for k in tagsIn: relation.tags[k] = tagsIn[k] for refTypeStr, refId, refRole in refsIn: relation.refTypeStrs.append(refTypeStr) relation.refIds.append(refId) relation.refRoles.append(refRole) data = pgmap.OsmData() data.relations.append(relation) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if not ok: t.Abort() print (errStr.errStr) return None else: t.Commit() return relation
def modify_node(nodeIn, nodeCurrentVer, user, timestamp = None): node = pgmap.OsmNode() node.objId = nodeIn.objId node.metaData.version = nodeCurrentVer + 1 if timestamp is None: node.metaData.timestamp = int(time.time()) else: node.metaData.timestamp = int(timestamp) node.metaData.changeset = 1000 node.metaData.uid = user.id node.metaData.username = user.username node.metaData.visible = True node.tags["test"] = "winter" node.lat = nodeIn.lat + 0.1 node.lon = nodeIn.lon + 0.2 data = pgmap.OsmData() data.nodes.append(node) createdNodeIds = pgmap.mapi64i64() createdWayIds = pgmap.mapi64i64() createdRelationIds = pgmap.mapi64i64() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.StoreObjects(data, createdNodeIds, createdWayIds, createdRelationIds, False, errStr) if not ok: t.Abort() print (errStr.errStr) else: t.Commit() return ok, node
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 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 handle(self, *args, **options): t = p.GetTransaction("ACCESS SHARE") errStr = pgmap.PgMapError() value = t.GetMetaValue(options['key'][0].encode('utf-8'), errStr) t.Commit() self.stdout.write(self.style.SUCCESS('All done! ' + value))
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 tearDown(self): u = User.objects.get(username=self.username) u.delete() errStr = pgmap.PgMapError() t = p.GetTransaction("EXCLUSIVE") ok = t.ResetActiveTables(errStr) if not ok: print(errStr.errStr) t.Commit()
def object_history(request, objType, objId): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetObjectsHistoryById(objType, [int(objId)], osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def relations_for_obj(request, objType, objId): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetRelationsForObjs(objType.encode("UTF-8"), [int(objId)], osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def ways_for_node(request, objType, objId): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetWaysForNodes([int(objId)], osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def object_version(request, objType, objId, objVer): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() idVerPair = pgmap.pairi64i64(int(objId), int(objVer)) t.GetObjectsByIdVer(objType, [idVerPair], osmData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
def get_affected_from_upload(request): t = p.GetTransaction("ACCESS SHARE") affectedData = pgmap.OsmData() t.GetAffectedObjects(request.data, affectedData) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio) affectedData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
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 handle(self, *args, **options): t = p.GetTransaction("EXCLUSIVE") errStr = pgmap.PgMapError() ok = t.SetMetaValue(options['key'][0].encode('utf-8'), options['value'][0].encode('utf-8'), errStr) if not ok: t.Abort() raise CommandError(errStr.errStr) t.Commit() self.stdout.write(self.style.SUCCESS('All done!'))
def index(request): t = p.GetTransaction("ACCESS SHARE") errStr = pgmap.PgMapError() value = int(t.GetMetaValue("readonly", errStr)) dbStatus = "OK" if value != 0: dbStatus = "Read only" t.Commit() return render(request, 'frontpage/index.html', {'db_status': dbStatus})
def create(request, objType): t = p.GetTransaction("EXCLUSIVE") obj = None if objType == "node": obj = request.data.nodes[0] if objType == "way": obj = request.data.ways[0] if objType == "relation": obj = request.data.relations[0] ret = upload_single_object("created", request, obj, objType, t) if ret != True: return ret return HttpResponse("", content_type='text/plain')
def object_history(request, objType, objId): t = p.GetTransaction("ACCESS SHARE") osmData = pgmap.OsmData() t.GetObjectsHistoryById(objType, [int(objId)], osmData) if len(osmData.nodes) + len(osmData.ways) + len(osmData.relations) == 0: return HttpResponseNotFound("{} {} not found".format(objType, objId)) sio = io.BytesIO() enc = pgmap.PyOsmXmlEncode(sio, common.xmlAttribs) osmData.StreamTo(enc) return HttpResponse(sio.getvalue(), content_type='text/xml')
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 handle(self, *args, **options): t = p.GetTransaction("EXCLUSIVE") errStr = pgmap.PgMapError() whereBeforeTimestamp = int(time.time()) - (24 * 60 * 60) closedTimestamp = int(time.time()) value = t.CloseChangesetsOlderThan(whereBeforeTimestamp, closedTimestamp, errStr) t.Commit() self.stdout.write(self.style.SUCCESS('All done!'))