def process_mapdata(): # We create the MapData models here. We can't create them until the # Page objects are created. global mapdata_objects_to_create from maps.models import MapData from pages.models import Page, slugify from django.contrib.gis.geos import Point, MultiPoint for item in mapdata_objects_to_create: page_name = item["pagename"].encode("utf-8") print "Adding mapdata for", page_name try: p = Page.objects.get(slug=slugify(item["pagename"])) except Page.DoesNotExist: print "*** Warning *** Skipping mapdata for page", page_name print (" Found mapdata for the page on wikimedia site, but " "the page does not exist in localwiki.") continue mapdata = MapData.objects.filter(page=p) y = float(item["lat"]) x = float(item["lon"]) point = Point(x, y) if mapdata: m = mapdata[0] points = m.points points.append(point) m.points = points else: points = MultiPoint(point) m = MapData(page=p, points=points) try: m.save() except IntegrityError: connection.close()
def process_mapdata(): # We create the MapData models here. We can't create them until the # Page objects are created. global mapdata_objects_to_create from maps.models import MapData from pages.models import Page, slugify from django.contrib.gis.geos import Point, MultiPoint for item in mapdata_objects_to_create: print "Adding mapdata for", item['pagename'] p = Page.objects.get(slug=slugify(item['pagename'])) mapdata = MapData.objects.filter(page=p) y = float(item['lat']) x = float(item['lon']) point = Point(x, y) if mapdata: m = mapdata[0] points = m.points points.append(point) m.points = points else: points = MultiPoint(point) m = MapData(page=p, points=points) m.save()
def post_process_mapdata(): """ A management command that looks at all the imported pages and finds coordinates to turn into real mapdata. This should be run after a successful mediawiki import. """ import codecs #Only used during debugging from django.contrib.gis.geos import Point, MultiPoint from maps.models import MapData from pages.models import Page for p in Page.objects.all(): print 'Looking for mapdata in', p.name coord = find_non_googlemaps_coordinates(p.content) if coord: print "Adding mapdata for", p.name mapdata = MapData.objects.filter(page=p) y = float(coord['lat']) x = float(coord['lon']) point = Point(x, y) if mapdata: m = mapdata[0] points = m.points points.append(point) m.points = points else: points = MultiPoint(point) m = MapData(page=p, points=points) try: m.save() except IntegrityError: connection.close() except ValueError: print "Bad value in mapdata"
def test_move_with_fks(self): ########################################################### # Moving should carry along files and FK'ed items that # point to it. ########################################################### p = Page(region=self.sf) p.content = "<p>A page with files and a map in SF.</p>" p.name = "Page With FKs" p.save() # Create a file that points at the page. pf = PageFile(file=ContentFile("foo"), name="file.txt", slug=p.slug, region=self.sf) pf.save() # Create a redirect that points at the page. redirect = Redirect(source="foobar", destination=p, region=self.sf) redirect.save() # Create a map that points at the page. points = GEOSGeometry("""MULTIPOINT (-122.4378964233400069 37.7971758820830033, -122.3929211425700032 37.7688207875790027, -122.3908612060599950 37.7883584775320003, -122.4056240844700056 37.8013807351830025, -122.4148937988299934 37.8002956347170027, -122.4183270263600036 37.8051784612779969)""") map = MapData(points=points, page=p, region=self.sf) map.save() # Add tags to page tagset = PageTagSet(page=p, region=self.sf) tagset.save() tag = Tag(name="tag1", region=self.sf) tag.save() tagset.tags.add(tag) move_to_region(self.oak, pages=[p]) # Check to see that the related objects were moved. p = Page.objects.get(name="Page With FKs", region=self.oak) self.assertEqual(len(MapData.objects.filter(page=p, region=self.oak)), 1) self.assertEqual(len(p.pagetagset.tags.all()), 1) self.assertEqual(len(Redirect.objects.filter(destination=p, region=self.oak)), 1) self.assertEqual(len(PageFile.objects.filter(slug=p.slug, region=self.oak)), 1) # Check to see that version history was moved as well self.assertEquals(p.versions.all().count(), 1) self.assertEqual(len(MapData.versions.filter(page=p, region=self.oak)), 1) for pts in p.pagetagset.tags.all(): self.assertEqual(pts.versions.all().count(), 1) self.assertEqual(len(Redirect.versions.filter(destination=p, region=self.oak)), 1) self.assertEqual(len(PageFile.versions.filter(slug=p.slug, region=self.oak)), 1) # ..and that the page is no longer in the SF region self.assertFalse(Page.objects.filter(region=self.sf, name="Page With FKs").exists())
def test_banned_cant_edit(self): # Add Marina to the SF banned list banned_sf, created = BannedFromRegion.objects.get_or_create(region=self.sf) banned_sf.users.add(self.marina) p = Page(name="In sf", region=self.sf) self.assertFalse(self.marina.has_perm('pages.change_page', p)) mapdata = MapData(page=p, region=self.sf) self.assertFalse(self.marina.has_perm('maps.change_map', mapdata)) redirect = Redirect(source="testsource", destination=p, region=self.sf) self.assertFalse(self.marina.has_perm('redirects.change_redirect', redirect))
def test_page_rename(self): p = Page() p.content = "<p>The page content.</p>" p.name = "Original page" p.save() p.rename_to("New page") # Renamed-to page should exist. new_p = Page.objects.get(name="New page") # new_p should have the same content. self.assertEqual(new_p.content, p.content) # "Original page" should no longer exist. pgs = Page.objects.filter(name="Original page") self.assertEqual(len(pgs), 0) # and a redirect from "original page" to "New page" should exist. Redirect.objects.filter(source="original page", destination=new_p) ########################################################### # Renaming to a page that already exists should raise an # exception and not affect the original page. ########################################################### p = Page() p.content = "<p>Hello, world.</p>" p.name = "Page A" p.save() self.assertRaises(exceptions.PageExistsError, p.rename_to, "New page") # p should be unaffected. No redirect should be created. p = Page.objects.get(name="Page A") self.assertEqual(p.content, "<p>Hello, world.</p>") self.assertEqual(len(Redirect.objects.filter(source="page a")), 0) ########################################################### # Renaming should carry along files and FK'ed items that # point to it. ########################################################### p = Page() p.content = "<p>A page with files and a map.</p>" p.name = "Page With FKs" p.save() # Create a file that points at the page. pf = PageFile(file=ContentFile("foo"), name="file.txt", slug=p.slug) pf.save() # Create a redirect that points at the page. redirect = Redirect(source="foobar", destination=p) redirect.save() # Create a map that points at the page. points = GEOSGeometry("""MULTIPOINT (-122.4378964233400069 37.7971758820830033, -122.3929211425700032 37.7688207875790027, -122.3908612060599950 37.7883584775320003, -122.4056240844700056 37.8013807351830025, -122.4148937988299934 37.8002956347170027, -122.4183270263600036 37.8051784612779969)""") map = MapData(points=points, page=p) map.save() p.rename_to("New Page With FKs") new_p = Page.objects.get(name="New Page With FKs") self.assertEqual(len(MapData.objects.filter(page=new_p)), 1) # Two redirects: one we created explicitly and one that was # created during rename_to() self.assertEqual(len(Redirect.objects.filter(destination=new_p)), 2) self.assertEqual(len(PageFile.objects.filter(slug=new_p.slug)), 1) # Renaming should keep slugs pointed at old page /and/ copy # them to the new page. self.assertEqual(len(PageFile.objects.filter(slug=p.slug)), 1) ########################################################### # Renaming with multiple files. ########################################################### p = Page() p.content = "<p>A new page with multiple files.</p>" p.name = "Page with multiple files" p.save() # Create a file that points at the page. pf = PageFile(file=ContentFile("foo"), name="file.txt", slug=p.slug) pf.save() pf = PageFile(file=ContentFile("foo2"), name="file2.txt", slug=p.slug) pf.save() pf = PageFile(file=ContentFile("foo3"), name="file3.txt", slug=p.slug) pf.save() p.rename_to("A page with multiple files 2") p = Page.objects.get(name="A page with multiple files 2") self.assertEqual(len(PageFile.objects.filter(slug=p.slug)), 3) ########################################################### # Reverting a renamed page should be possible and should # restore files and FK'ed items that were pointed at the # original page. The renamed-to page should still exist # after the revert and should still have its own files and # FK'ed items pointed at it. ########################################################### p = Page(name="Page With FKs", slug="page with fks") # get the version right before it was deleted v_before_deleted = len(p.versions.all()) - 1 p_h = p.versions.as_of(version=v_before_deleted) p_h.revert_to() p = Page.objects.get(name="Page With FKs") self.assertEqual(len(MapData.objects.filter(page=p)), 1) self.assertEqual(len(PageFile.objects.filter(slug=p.slug)), 1) p2 = Page.objects.get(name="New Page With FKs") self.assertEqual(len(MapData.objects.filter(page=p2)), 1) self.assertEqual(len(PageFile.objects.filter(slug=p2.slug)), 1) self.assertEqual(len(Redirect.objects.filter(destination=p2)), 1) ########################################################### # Renaming a page and then renaming it back. ########################################################### # 1. Simple case p = Page(name="Page X", content="<p>Foobar</p>") p.save() p.rename_to("Page Y") self.assertEqual(len(Page.objects.filter(name="Page X")), 0) self.assertEqual(len(Page.objects.filter(name="Page Y")), 1) p_new = Page.objects.get(name="Page Y") p_new.rename_to("Page X") self.assertEqual(len(Page.objects.filter(name="Page X")), 1) self.assertEqual(len(Page.objects.filter(name="Page Y")), 0) # 2. If we have FKs pointed at the page this shouldn't be # totally f****d. p = Page(name="Page X2", content="<p>Foo X</p>") p.save() points = GEOSGeometry("""MULTIPOINT (-122.4378964233400069 37.7971758820830033, -122.3929211425700032 37.7688207875790027, -122.3908612060599950 37.7883584775320003, -122.4056240844700056 37.8013807351830025, -122.4148937988299934 37.8002956347170027, -122.4183270263600036 37.8051784612779969)""") map = MapData(points=points, page=p) map.save() # Create a file that points at the page. pf = PageFile(file=ContentFile("foooo"), name="file_foo.txt", slug=p.slug) pf.save() p.rename_to("Page Y2") p_new = Page.objects.get(name="Page Y2") # FK points at the page we renamed to. self.assertEqual(len(MapData.objects.filter(page=p_new)), 1) self.assertEqual(len(PageFile.objects.filter(slug=p_new.slug)), 1) # Now rename it back. p_new.rename_to("Page X2") p = Page.objects.get(name="Page X2") # After rename-back-to, FK points to the renamed-back-to page. self.assertEqual(len(MapData.objects.filter(page=p)), 1) self.assertEqual(len(PageFile.objects.filter(slug=p.slug)), 1) ########################################################### # Renaming a page but keeping the same slug ########################################################### p = Page(name="Foo A", content="<p>Foo A</p>") p.save() p.rename_to("FOO A") # Name has changed. self.assertEqual(len(Page.objects.filter(name="FOO A")), 1) # Has the same history, with a new entry for the name change. p = Page.objects.get(name="FOO A") p1, p0 = p.versions.all() self.assertEqual(p1.name, 'FOO A') self.assertEqual(p0.name, 'Foo A') self.assertEqual(p0.content, p1.content) ########################################################### # Renaming a page twice (A -> B -> C) and then revert A to # an existing state. ########################################################### p = Page(name="Bar A", content="<p>Bar A</p>") p.save() p.rename_to("Bar B") p = Page.objects.get(name="Bar B") p.rename_to("Bar C") p = Page(name="Bar A", slug="bar a") p_h = p.versions.as_of(version=1) p_h.revert_to() ########################################################### # Renaming a page back and forth and reverting. ########################################################### p = Page(name="Zoo A", content="<p>Zoo A</p>") p.save() p.rename_to("Zoo B") p = Page.objects.get(name="Zoo B") p.rename_to("Zoo A") p = Page.objects.get(name="Zoo A") p.rename_to("Zoo B") p = Page(name="Zoo A", slug="zoo a") p_h = p.versions.as_of(version=1) p_h.revert_to() ########################################################### # page A, rename to B, then create new A, rename B to C, # rename C to B, then revert C to first version ########################################################### p = Page(name="Mike A", content="<p>A</p>") p.save() p.rename_to("Mike B") new_a = Page(name="Mike A", content="<p>A new</p>") new_a.save() p = Page.objects.get(name="Mike B") p.rename_to("Mike C") p = Page.objects.get(name="Mike C") p.rename_to("Mike B") p_c = Page(name="Mike C", slug="mike c") p_h = p_c.versions.as_of(version=1) p_h.revert_to()