38 |
from xmlsupport import sax_eventlist |
from xmlsupport import sax_eventlist |
39 |
|
|
40 |
import dbflib |
import dbflib |
41 |
|
import shapelib |
42 |
|
|
43 |
from Thuban.Model.save import save_session |
from Thuban.Model.save import save_session |
44 |
from Thuban.Model.load import load_session, parse_color, LoadError, \ |
from Thuban.Model.load import load_session, parse_color, LoadError, \ |
47 |
from Thuban.Model.classification import ClassGroupProperties, ClassGroupRange,\ |
from Thuban.Model.classification import ClassGroupProperties, ClassGroupRange,\ |
48 |
ClassGroupSingleton, ClassGroupDefault |
ClassGroupSingleton, ClassGroupDefault |
49 |
from Thuban.Model.postgisdb import ConnectionError |
from Thuban.Model.postgisdb import ConnectionError |
50 |
|
from Thuban.Model.table import DBFTable, MemoryTable, \ |
51 |
|
FIELDTYPE_DOUBLE, FIELDTYPE_INT, FIELDTYPE_STRING, \ |
52 |
|
table_to_dbf |
53 |
|
|
54 |
|
|
55 |
def filenames_equal(name1, name2): |
def filenames_equal(name1, name2): |
56 |
"""Return true if the filenames name1 and name2 are equal. |
"""Return true if the filenames name1 and name2 are equal. |
270 |
self.assertEquals(len(session.ShapeStores()), 0) |
self.assertEquals(len(session.ShapeStores()), 0) |
271 |
|
|
272 |
|
|
273 |
|
class TestNonAsciiColumnName(LoadSessionTest): |
274 |
|
|
275 |
|
file_contents = '''\ |
276 |
|
<?xml version="1.0" encoding="UTF-8"?> |
277 |
|
<!DOCTYPE session SYSTEM "thuban-1.0.dtd"> |
278 |
|
<session xmlns="http://thuban.intevation.org/dtds/thuban-1.0-dev.dtd" |
279 |
|
title="Non ASCII column name test"> |
280 |
|
<fileshapesource filetype="shapefile" id="D1" |
281 |
|
filename="TestNonAsciiColumnName.shp"/> |
282 |
|
<map title="map"> |
283 |
|
<projection name="Some Projection"> |
284 |
|
<parameter value="datum=WGS84"/> |
285 |
|
<parameter value="ellps=WGS84"/> |
286 |
|
<parameter value="proj=utm"/> |
287 |
|
<parameter value="units=m"/> |
288 |
|
<parameter value="zone=27"/> |
289 |
|
</projection> |
290 |
|
<layer shapestore="D1" visible="true" |
291 |
|
stroke="#000000" title="layer" stroke_width="1" |
292 |
|
fill="None"> |
293 |
|
<classification field="Fl\xc3\xa4che" field_type="double"> |
294 |
|
<clnull label=""> |
295 |
|
<cldata stroke="#000000" stroke_width="1" fill="None"/> |
296 |
|
</clnull> |
297 |
|
</classification> |
298 |
|
</layer> |
299 |
|
</map> |
300 |
|
</session> |
301 |
|
''' |
302 |
|
|
303 |
|
def test(self): |
304 |
|
"""Load a session with a single map with a single layer""" |
305 |
|
|
306 |
|
# Create a shapefile and a dbffile with a non-ascii column name |
307 |
|
dbffile = self.temp_file_name("TestNonAsciiColumnName.dbf") |
308 |
|
shpfile = self.temp_file_name("TestNonAsciiColumnName.shp") |
309 |
|
dbf = dbflib.create(dbffile) |
310 |
|
dbf.add_field('Fl\xe4che', dbflib.FTDouble, 10, 5) |
311 |
|
dbf.write_record(0, (0.0,)) |
312 |
|
dbf.close() |
313 |
|
shp = shapelib.create(shpfile, shapelib.SHPT_POLYGON) |
314 |
|
shp.write_object(-1, shapelib.SHPObject(shapelib.SHPT_POLYGON, 1, |
315 |
|
[[(0,0), (10, 10), (10, 0), |
316 |
|
(0, 0)]])) |
317 |
|
shp.close() |
318 |
|
|
319 |
|
try: |
320 |
|
session = load_session(self.filename()) |
321 |
|
except ValueError, v: |
322 |
|
# Usually if the field name is not decoded properly the |
323 |
|
# loading fails because the field type mentioned in the file |
324 |
|
# is not None as returned from the layer for a non-existing |
325 |
|
# column name so we check for that and report it as failure. |
326 |
|
# Other exceptions are errors in the test case. |
327 |
|
if str(v) == "xml field type differs from database!": |
328 |
|
self.fail("Cannot load file with non-ascii column names") |
329 |
|
else: |
330 |
|
raise |
331 |
|
self.session = session |
332 |
|
|
333 |
|
# In case Thuban could load the file anyway (i.e. no ValueError |
334 |
|
# exception in load_session()), check explicitly whether the |
335 |
|
# field name was decoded properly. The test will probably lead |
336 |
|
# to a UnicodeError instead of a test failure so we check that |
337 |
|
# too |
338 |
|
layer = session.Maps()[0].Layers()[0] |
339 |
|
try: |
340 |
|
self.assertEquals(layer.GetClassificationColumn(), 'Fl\xe4che') |
341 |
|
except UnicodeError: |
342 |
|
# FIXME: Obviously this will have to change if Thuban ever |
343 |
|
# supports unicode properly. |
344 |
|
self.fail("Column name was not converted to a bytestring") |
345 |
|
|
346 |
|
# roundtrip check |
347 |
|
self.check_format() |
348 |
|
|
349 |
|
|
350 |
class TestLayerVisibility(LoadSessionTest): |
class TestLayerVisibility(LoadSessionTest): |
351 |
|
|
352 |
file_contents = '''\ |
file_contents = '''\ |