Пример #1
0
	def test_upload_multi_action(self):

		cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True)

		node = create_node(self.user.id, self.user.username)
		node2 = create_node(self.user.id, self.user.username, node)
		way = create_way(self.user.id, self.user.username, [node.objId, node2.objId])

		xml = """<osmChange version="0.6" generator="JOSM">
		<create>
		  <node id='-3912' changeset='{0}' lat='50.78673385857' lon='-1.04730886255'>
			<tag k='abc' v='def' />
		  </node>
		</create>
		<modify>
		  <way id='{1}' changeset='{0}' version="{2}">
			<nd ref='-3912' />
			<nd ref='{3}' />
			<nd ref='{4}' />
			<tag k='ghi' v='jkl' />
		  </way>
		</modify>
		</osmChange>""".format(cs.objId, way.objId, way.metaData.version, node.objId, node2.objId)

		response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, 
			content_type='text/xml')
		if response.status_code != 200:
			print (response.content)
		self.assertEqual(response.status_code, 200)

		xml = fromstring(response.content)
		diffDict = ParseOsmDiffToDict(xml)
Пример #2
0
    def test_upload_delete_interdependent_objects(self):

        cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True)

        node = create_node(self.user.id, self.user.username)
        node2 = create_node(self.user.id, self.user.username, node)
        way = create_way(self.user.id, self.user.username,
                         [node.objId, node2.objId])

        xml = """<osmChange version="0.6" generator="JOSM">
		<delete>
		  <way id='{}' version='{}' changeset='{}'/>
		  <node id='{}' version='{}' changeset='{}'/>
		  <node id='{}' version='{}' changeset='{}'/>
		</delete>
		</osmChange>""".format(way.objId, way.metaData.version, cs.objId, node.objId,
                         node.metaData.version, cs.objId, node2.objId,
                         node2.metaData.version, cs.objId)

        response = self.client.post(reverse('changeset:upload',
                                            args=(cs.objId, )),
                                    xml,
                                    content_type='text/xml')
        #print (response.content)
        self.assertEqual(response.status_code, 200)
Пример #3
0
    def test_upload_delete_single_node(self):

        cs = CreateTestChangeset(self.user,
                                 tags={"foo": "interstellar"},
                                 is_open=True)
        node = create_node(self.user.id, self.user.username)

        xml = """<osmChange generator="JOSM" version="0.6">
		<delete>
		  <node changeset="{}" id="{}" lat="50.80" lon="-1.05" version="{}"/>
		</delete>
		</osmChange>""".format(cs.objId, node.objId, node.metaData.version)

        response = self.client.post(reverse('changeset:upload',
                                            args=(cs.objId, )),
                                    xml,
                                    content_type='text/xml')
        if response.status_code != 200:
            print(response.content)
        self.assertEqual(response.status_code, 200)

        xml = fromstring(response.content)
        self.assertEqual(len(xml), 1)
        ndiff = xml[0]
        self.assertEqual(int(ndiff.attrib["old_id"]), node.objId)

        dbNode = GetObj(p, "node", node.objId)
        self.assertEqual(dbNode is None, True)
Пример #4
0
    def test_upload_delete_relations_with_circular_reference(self):

        cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True)

        node = create_node(self.user.id, self.user.username)
        relation = create_relation(self.user.id, self.user.username,
                                   [("node", node.objId, "parrot")])
        relation2 = create_relation(self.user.id, self.user.username,
                                    [("node", node.objId, "parrot"),
                                     ("relation", relation.objId, "dead")])
        relation = modify_relation(self.user.id, self.user.username, relation,
                                   [("node", node.objId, "parrot"),
                                    ("relation", relation2.objId, "dead")], {})

        xml = """<osmChange version="0.6" generator="JOSM">
		<delete>
		  <relation id='{}' version='{}' changeset='{}'/>
		  <relation id='{}' version='{}' changeset='{}'/>
		</delete>
		</osmChange>""".format(relation.objId, relation.metaData.version, cs.objId,
                         relation2.objId, relation2.metaData.version, cs.objId)

        response = self.client.post(reverse('changeset:upload',
                                            args=(cs.objId, )),
                                    xml,
                                    content_type='text/xml')
        #print (response.content)
        self.assertEqual(response.status_code, 200)
Пример #5
0
	def test_delete_node_diff(self):
		ts = time.time() - 120
		ts2 = time.time() - 60
		node = qmt.create_node(self.user.id, self.user.username, timestamp = ts)
		ok = qmt.delete_object(node, self.user, timestamp = ts2)
		self.assertEqual(ok, True)
		cat = rv.TimestampToPath(int(ts2), "minute")

		anonClient = Client()
		response = anonClient.get(reverse('replicate:diffdata', args=['minute', str(cat[0]), str(cat[1]), str(cat[2])]))
		if response.status_code != 200:
			print (response.content)
		self.assertEqual(response.status_code, 200)

		osc = pgmap.OsmChange()
		pgmap.LoadFromOsmChangeXml(response.content.decode("utf-8"), osc)

		oscIndex = CreateIndexOsmChange(osc)

		self.assertEqual(node.objId in oscIndex["node"], True)
		found = False
		for action, obj in oscIndex["node"][node.objId]:
			print (action, obj.objId, obj.metaData.version)
			if action == "delete":
				found = True
				break
		self.assertEqual(found, True)
Пример #6
0
	def test_get_ways_for_node(self):
		anonClient = Client()

		node = create_node(self.user.id, self.user.username)
		node2 = create_node(self.user.id, self.user.username, node)
		way = create_way(self.user.id, self.user.username, [node.objId, node2.objId])

		response = anonClient.get(reverse('elements:ways_for_node', args=['node', str(node.objId)]))
		if response.status_code != 200:
			print (response.content)
		self.assertEqual(response.status_code, 200)

		osmData = DecodeOsmdataResponse([response.content])
		wayIdDict = GetOsmDataIndex(osmData)['way']

		self.assertEqual(len(wayIdDict), 1)
		self.assertEqual(way.objId in wayIdDict, True)
Пример #7
0
	def test_upload_delete_node_used_by_way(self):

		cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True)

		node = create_node(self.user.id, self.user.username)
		node2 = create_node(self.user.id, self.user.username, node)
		way = create_way(self.user.id, self.user.username, [node.objId, node2.objId])

		xml = """<osmChange generator="JOSM" version="0.6">
		<delete>
		  <node changeset="{}" id="{}" lat="50.80" lon="-1.05" version="{}"/>
		</delete>
		</osmChange>""".format(cs.objId, node.objId, node.metaData.version)

		response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, 
			content_type='text/xml')
		self.assertEqual(response.status_code, 412)
Пример #8
0
	def test_upload_delete_relation_used_by_relation_if_unused(self):
		cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True)

		node = create_node(self.user.id, self.user.username)
		node2 = create_node(self.user.id, self.user.username, node)
		relation = create_relation(self.user.id, self.user.username, [("node", node.objId, "parrot"), ("node", node2.objId, "dead")])
		relation2 = create_relation(self.user.id, self.user.username, [("node", node.objId, "parrot"), ("relation", relation.objId, "dead")])

		xml = """<osmChange generator="JOSM" version="0.6">
		<delete if-unused="true">
		  <relation changeset="{}" id="{}" version="{}"/>
		</delete>
		</osmChange>""".format(cs.objId, relation.objId, relation.metaData.version)

		response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, 
			content_type='text/xml')
		#print (response.content)
		self.assertEqual(response.status_code, 200)
Пример #9
0
	def test_upload_delete_undelete_way(self):
		cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True)

		node = create_node(self.user.id, self.user.username)
		node2 = create_node(self.user.id, self.user.username, node)
		way = create_way(self.user.id, self.user.username, [node.objId, node2.objId])

		xml = """<osmChange generator="JOSM" version="0.6">
		<delete>
		  <way changeset="{}" id="{}" version="{}"/>
		</delete>
		</osmChange>""".format(cs.objId, way.objId, node.metaData.version)

		response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, 
			content_type='text/xml')
		#print (response.content)
		self.assertEqual(response.status_code, 200)

		ok, way = modify_way(way, [node.objId, node2.objId], {}, self.user)
		self.assertEqual(ok, True)
Пример #10
0
	def test_create_relation_diff(self):
		ts = time.time() - 60
		node1 = qmt.create_node(self.user.id, self.user.username, timestamp = ts)
		node2 = qmt.create_node(self.user.id, self.user.username, timestamp = ts)
		refs = [("node", node1.objId, "foo"), ("node", node2.objId, "bar")]
		relation = qmt.create_relation(self.user.id, self.user.username, refs, timestamp = ts)
		cat = rv.TimestampToPath(relation.metaData.timestamp, "minute")

		anonClient = Client()
		response = anonClient.get(reverse('replicate:diffdata', args=['minute', str(cat[0]), str(cat[1]), str(cat[2])]))
		if response.status_code != 200:
			print (response.content)
		self.assertEqual(response.status_code, 200)

		osc = pgmap.OsmChange()
		pgmap.LoadFromOsmChangeXml(response.content.decode("utf-8"), osc)

		oscIndex = CreateIndexOsmChange(osc)

		self.assertEqual(relation.objId in oscIndex["relation"], True)
		self.assertEqual(oscIndex["relation"][relation.objId][0][0], "create")
Пример #11
0
	def test_upload_modify_single_node_wrong_user(self):

		cs = CreateTestChangeset(self.user, tags={"foo": "apollo"}, is_open=True)
		node = create_node(self.user.id, self.user.username)

		xml = """<osmChange generator="JOSM" version="0.6">
		<modify>
		  <node changeset="{}" id="{}" lat="50.80" lon="-1.05" version="{}">
			<tag k="note" v="Just a node"/>
		  </node>
		</modify>
		</osmChange>""".format(cs.objId, node.objId, node.metaData.version)

		response = self.client2.post(reverse('changeset:upload', args=(cs.objId,)), xml, 
			content_type='text/xml')
		self.assertEqual(response.status_code, 409)
Пример #12
0
	def test_create_node_diff(self):
		ts = time.time() - 60
		node = qmt.create_node(self.user.id, self.user.username, timestamp = ts)
		cat = rv.TimestampToPath(node.metaData.timestamp, "minute")

		#Check minutely diff
		anonClient = Client()
		response = anonClient.get(reverse('replicate:diffdata', args=['minute', str(cat[0]), str(cat[1]), str(cat[2])]))
		if response.status_code != 200:
			print (response.content)
		self.assertEqual(response.status_code, 200)

		osc = pgmap.OsmChange()
		pgmap.LoadFromOsmChangeXml(response.content.decode("utf-8"), osc)

		oscIndex = CreateIndexOsmChange(osc)

		self.assertEqual(node.objId in oscIndex["node"], True)
		self.assertEqual(oscIndex["node"][node.objId][0][0], "create")
Пример #13
0
	def test_create_node_diff_custom_range(self):
		ts = time.time() - 60
		node = qmt.create_node(self.user.id, self.user.username, timestamp = ts)

		#Check custom time range diff
		anonClient = Client()
		startTs = datetime.datetime.utcfromtimestamp(ts-5).isoformat()
		endTs = datetime.datetime.utcfromtimestamp(ts+5).isoformat()
		response = anonClient.get(reverse('replicate:customdiff')+'?start={}&end={}'.format(startTs, endTs))
		if response.status_code != 200:
			print (response.content)
		self.assertEqual(response.status_code, 200)

		osc = pgmap.OsmChange()
		pgmap.LoadFromOsmChangeXml(response.content.decode("utf-8"), osc)

		oscIndex = CreateIndexOsmChange(osc)

		self.assertEqual(node.objId in oscIndex["node"], True)
		self.assertEqual(oscIndex["node"][node.objId][0][0], "create")
Пример #14
0
	def test_upload_modify_single_node(self):

		cs = CreateTestChangeset(self.user, tags={"foo": "interstellar"}, is_open=True)
		node = create_node(self.user.id, self.user.username)

		xml = """<osmChange generator="JOSM" version="0.6">
		<modify>
		  <node changeset="{}" id="{}" lat="50.80" lon="-1.05" version="{}">
			<tag k="note" v="Just a node"/>
		  </node>
		</modify>
		</osmChange>""".format(cs.objId, node.objId, node.metaData.version)

		response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, 
			content_type='text/xml')
		if response.status_code != 200:
			print (response.content)
		self.assertEqual(response.status_code, 200)

		xml = fromstring(response.content)
		self.assertEqual(len(xml), 1)
		ndiff = xml[0]
		self.assertEqual(int(ndiff.attrib["old_id"]), node.objId)
		self.assertEqual(int(ndiff.attrib["new_version"]), node.metaData.version+1)
		self.assertEqual(int(ndiff.attrib["new_id"]), node.objId)

		dbNode = GetObj(p, "node", node.objId)
		self.assertEqual(abs(dbNode.lat-50.80)<1e-6, True)
		self.assertEqual(abs(dbNode.lon+1.05)<1e-6, True)
		self.assertEqual(len(dbNode.tags), 1)

		# Check xml download is reasonable
		response2 = self.client.get(reverse('changeset:download', args=(cs.objId,)))
		xml2 = fromstring(response2.content)
		for ch in xml2:
			self.assertEqual(ch.tag, "modify")
			for ch2 in ch:
				self.assertEqual(ch2.tag, "node")
Пример #15
0
	def test_upload_delete_undelete_single_node(self):
	
		cs = CreateTestChangeset(self.user, tags={"foo": "interstellar"}, is_open=True)
		node = create_node(self.user.id, self.user.username)

		xml = """<osmChange generator="JOSM" version="0.6">
		<delete>
		  <node changeset="{}" id="{}" lat="50.80" lon="-1.05" version="{}"/>
		</delete>
		</osmChange>""".format(cs.objId, node.objId, node.metaData.version)

		response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, 
			content_type='text/xml')
		if response.status_code != 200:
			print (response.content)
		self.assertEqual(response.status_code, 200)

		xml = fromstring(response.content)
		self.assertEqual(len(xml), 1)
		ndiff = xml[0]
		self.assertEqual(int(ndiff.attrib["old_id"]), node.objId)

		dbNode = GetObj(p, "node", node.objId)
		self.assertEqual(dbNode is None, True)

		# Check xml download is reasonable
		response2 = self.client.get(reverse('changeset:download', args=(cs.objId,)))
		xml2 = fromstring(response2.content)
		for ch in xml2:
			self.assertEqual(ch.tag, "delete")
			for ch2 in ch:
				self.assertEqual(ch2.tag, "node")

		# Undelete node by uploading new version
		ok, node = modify_node(node, node.metaData.version+1, self.user)
		self.assertEqual(ok, True)
Пример #16
0
    def test_upload_create_complex(self):

        cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True)

        node = create_node(self.user.id, self.user.username)

        xml = """<osmChange version="0.6" generator="JOSM">
		<create>
		  <node id='-3912' changeset='{0}' lat='50.78673385857' lon='-1.04730886255'>
			<tag k='abc' v='def' />
		  </node>
		  <node id='-3910' changeset='{0}' lat='50.7865119298' lon='-1.04843217891' />
		  <node id='-3909' changeset='{0}' lat='50.78724872927' lon='-1.04808114255' />
		  <way id='-3911' changeset='{0}'>
			<nd ref='-3909' />
			<nd ref='-3910' />
			<nd ref='-3912' />
			<nd ref='{1}' />
			<tag k='ghi' v='jkl' />
		  </way>
		  <relation id='-3933' changeset='{0}'>
			<member type='way' ref='-3911' role='lmn' />
			<member type='node' ref='-3909' role='opq' />
			<tag k='rst' v='uvw' />
		  </relation>
		  <relation id='-3934' changeset='{0}'>
			<member type='way' ref='-3911' role='lmn' />
			<member type='relation' ref='-3933' role='opq' />
			<tag k='rst' v='xyz' />
		  </relation>
		</create>
		</osmChange>""".format(cs.objId, node.objId)

        response = self.client.post(reverse('changeset:upload',
                                            args=(cs.objId, )),
                                    xml,
                                    content_type='text/xml')
        if response.status_code != 200:
            print(response.content)
        self.assertEqual(response.status_code, 200)

        xml = fromstring(response.content)
        diffDict = ParseOsmDiffToDict(xml)

        way = GetObj(p, "way", diffDict["way"][-3911][0])
        wayRefs = list(way.refs)
        for diffId, diffVer in diffDict["node"].values():
            self.assertEqual(diffId in wayRefs, True)
        self.assertEqual(node.objId in wayRefs, True)

        wayTags = dict(way.tags)
        self.assertEqual(wayTags, {'ghi': 'jkl'})

        rel1 = GetObj(p, "relation", diffDict["relation"][-3933][0])
        rel1Refs = zip(list(rel1.refTypeStrs), list(rel1.refIds),
                       list(rel1.refRoles))
        self.assertEqual(("way", diffDict["way"][-3911][0], "lmn") in rel1Refs,
                         True)
        self.assertEqual(("node", diffDict["node"][-3909][0], "opq")
                         in rel1Refs, True)

        rel1Tags = dict(rel1.tags)
        self.assertEqual(rel1Tags, {'rst': 'uvw'})

        rel2 = GetObj(p, "relation", diffDict["relation"][-3934][0])
        rel2Refs = zip(list(rel2.refTypeStrs), list(rel2.refIds),
                       list(rel2.refRoles))
        self.assertEqual(("way", diffDict["way"][-3911][0], "lmn") in rel2Refs,
                         True)
        self.assertEqual(("relation", diffDict["relation"][-3933][0], "opq")
                         in rel2Refs, True)

        rel2Tags = dict(rel2.tags)
        self.assertEqual(rel2Tags, {'rst': 'xyz'})