/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/Model/save.py
ViewVC logotype

Diff of /branches/WIP-pyshapelib-bramz/Thuban/Model/save.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1417 by bh, Tue Jul 15 08:43:53 2003 UTC revision 2104 by bh, Fri Mar 12 12:19:15 2004 UTC
# Line 1  Line 1 
1  # Copyright (c) 2001, 2002, 2003 by Intevation GmbH  # Copyright (c) 2001, 2002, 2003, 2004 by Intevation GmbH
2  # Authors:  # Authors:
3  # Jan-Oliver Wagner <[email protected]>  # Jan-Oliver Wagner <[email protected]>
4  # Bernhard Herzog <[email protected]>  # Bernhard Herzog <[email protected]>
# Line 26  from Thuban.Model.table import DBFTable, Line 26  from Thuban.Model.table import DBFTable,
26  from Thuban.Model.data import DerivedShapeStore, ShapefileStore  from Thuban.Model.data import DerivedShapeStore, ShapefileStore
27    
28  from Thuban.Model.xmlwriter import XMLWriter  from Thuban.Model.xmlwriter import XMLWriter
29    from postgisdb import PostGISConnection, PostGISShapeStore
30    
31  def relative_filename(dir, filename):  def relative_filename(dir, filename):
32      """Return a filename relative to dir for the absolute file name absname.      """Return a filename relative to dir for the absolute file name absname.
# Line 40  def relative_filename(dir, filename): Line 41  def relative_filename(dir, filename):
41          return filename          return filename
42    
43    
44    def unify_filename(filename):
45        """Return a 'unified' version of filename
46    
47        The .thuban files should be as platform independent as possible.
48        Since they must contain filenames the filenames have to unified. We
49        unify on unix-like filenames for now, which means we do nothing on a
50        posix system and simply replace backslashes with slashes on windows
51        """
52        if os.name == "posix":
53            return filename
54        elif os.name == "nt":
55            return "/".join(filename.split("\\"))
56        else:
57            raise RuntimeError("Unsupported platform for unify_filename: %s"
58                               % os.name)
59    
60  def sort_data_stores(stores):  def sort_data_stores(stores):
61      """Return a topologically sorted version of the sequence of data containers      """Return a topologically sorted version of the sequence of data containers
62    
# Line 102  class SessionSaver(XMLWriter): Line 119  class SessionSaver(XMLWriter):
119      def has_id(self, obj):      def has_id(self, obj):
120          return self.idmap.has_key(id(obj))          return self.idmap.has_key(id(obj))
121    
122        def prepare_filename(self, filename):
123            """Return the string to use when writing filename to the thuban file
124    
125            The returned string is a unified version (only slashes as
126            directory separators, see unify_filename) of filename expressed
127            relative to the directory the .thuban file is written to.
128            """
129            return unify_filename(relative_filename(self.dir, filename))
130    
131      def write(self, file_or_filename):      def write(self, file_or_filename):
132          XMLWriter.write(self, file_or_filename)          XMLWriter.write(self, file_or_filename)
133    
134          self.write_header("session", "thuban-0.9.dtd")          self.write_header("session", "thuban-1.1.dtd")
135          self.write_session(self.session)          self.write_session(self.session)
136          self.close()          self.close()
137    
# Line 132  class SessionSaver(XMLWriter): Line 158  class SessionSaver(XMLWriter):
158              attrs["xmlns:" + name] = uri              attrs["xmlns:" + name] = uri
159          # default name space          # default name space
160          attrs["xmlns"] = \          attrs["xmlns"] = \
161                 "http://thuban.intevation.org/dtds/thuban-0.9-dev.dtd"                 "http://thuban.intevation.org/dtds/thuban-1.1-dev.dtd"
162          self.open_element("session", attrs)          self.open_element("session", attrs)
163            self.write_db_connections(session)
164          self.write_data_containers(session)          self.write_data_containers(session)
165          for map in session.Maps():          for map in session.Maps():
166              self.write_map(map)              self.write_map(map)
167          self.close_element("session")          self.close_element("session")
168    
169        def write_db_connections(self, session):
170            for conn in session.DBConnections():
171                if isinstance(conn, PostGISConnection):
172                    self.write_element("dbconnection",
173                                       {"id": self.define_id(conn),
174                                        "dbtype": "postgis",
175                                        "host": conn.host,
176                                        "port": conn.port,
177                                        "user": conn.user,
178                                        "dbname": conn.dbname})
179                else:
180                    raise ValueError("Can't handle db connection %r" % conn)
181    
182      def write_data_containers(self, session):      def write_data_containers(self, session):
183          containers = sort_data_stores(session.DataContainers())          containers = sort_data_stores(session.DataContainers())
184          for container in containers:          for container in containers:
# Line 156  class SessionSaver(XMLWriter): Line 196  class SessionSaver(XMLWriter):
196              idvalue = self.define_id(container)              idvalue = self.define_id(container)
197              if isinstance(container, ShapefileStore):              if isinstance(container, ShapefileStore):
198                  self.define_id(container.Table(), idvalue)                  self.define_id(container.Table(), idvalue)
199                  filename = relative_filename(self.dir, container.FileName())                  filename = self.prepare_filename(container.FileName())
200                  self.write_element("fileshapesource",                  self.write_element("fileshapesource",
201                                     {"id": idvalue, "filename": filename,                                     {"id": idvalue, "filename": filename,
202                                      "filetype": "shapefile"})                                      "filetype": "shapefile"})
# Line 166  class SessionSaver(XMLWriter): Line 206  class SessionSaver(XMLWriter):
206                                     {"id": idvalue,                                     {"id": idvalue,
207                                      "shapesource": self.get_id(shapesource),                                      "shapesource": self.get_id(shapesource),
208                                      "table": self.get_id(table)})                                      "table": self.get_id(table)})
209                elif isinstance(container, PostGISShapeStore):
210                    conn = container.DBConnection()
211                    self.write_element("dbshapesource",
212                                       {"id": idvalue,
213                                        "dbconn": self.get_id(conn),
214                                        "tablename": container.TableName(),
215                                        "id_column": container.IDColumn().name,
216                                        "geometry_column":
217                                          container.GeometryColumn().name,
218                                        })
219              elif isinstance(container, DBFTable):              elif isinstance(container, DBFTable):
220                  filename = relative_filename(self.dir, container.FileName())                  filename = self.prepare_filename(container.FileName())
221                  self.write_element("filetable",                  self.write_element("filetable",
222                                     {"id": idvalue,                                     {"id": idvalue,
223                                      "title": container.Title(),                                      "title": container.Title(),
# Line 208  class SessionSaver(XMLWriter): Line 258  class SessionSaver(XMLWriter):
258          """Write the projection.          """Write the projection.
259          """          """
260          if projection and len(projection.params) > 0:          if projection and len(projection.params) > 0:
261              self.open_element("projection", {"name": projection.GetName()})              attrs = {"name": projection.GetName()}
262                epsg = projection.EPSGCode()
263                if epsg is not None:
264                    attrs["epsg"] = epsg
265                self.open_element("projection", attrs)
266              for param in projection.params:              for param in projection.params:
267                  self.write_element('parameter value="%s"' %                  self.write_element('parameter value="%s"' %
268                                     self.encode(param))                                     self.encode(param))
# Line 241  class SessionSaver(XMLWriter): Line 295  class SessionSaver(XMLWriter):
295              self.write_classification(layer)              self.write_classification(layer)
296              self.close_element("layer")              self.close_element("layer")
297          elif isinstance(layer, RasterLayer):          elif isinstance(layer, RasterLayer):
298              attrs["filename"] = relative_filename(self.dir, layer.filename)              attrs["filename"] = self.prepare_filename(layer.filename)
299              self.open_element("rasterlayer", attrs)              self.open_element("rasterlayer", attrs)
300              self.write_projection(layer.GetProjection())              self.write_projection(layer.GetProjection())
301              self.close_element("rasterlayer")              self.close_element("rasterlayer")
# Line 254  class SessionSaver(XMLWriter): Line 308  class SessionSaver(XMLWriter):
308    
309          lc = layer.GetClassification()          lc = layer.GetClassification()
310    
311          field = lc.GetField()          field = layer.GetClassificationColumn()
312    
313          #          #
314          # there isn't a classification of anything so do nothing          # there isn't a classification of anything so do nothing
315          #          #
316          if field is None: return          if field is None: return
317    
318          attrs["field"] = field          attrs["field"] = field
319          attrs["field_type"] = str(lc.GetFieldType())          attrs["field_type"] = str(layer.GetFieldType(field))
320          self.open_element("classification", attrs)          self.open_element("classification", attrs)
321    
322          for g in lc:          for g in lc:
# Line 270  class SessionSaver(XMLWriter): Line 324  class SessionSaver(XMLWriter):
324                  open_el  = 'clnull label="%s"' % self.encode(g.GetLabel())                  open_el  = 'clnull label="%s"' % self.encode(g.GetLabel())
325                  close_el = 'clnull'                  close_el = 'clnull'
326              elif isinstance(g, ClassGroupSingleton):              elif isinstance(g, ClassGroupSingleton):
327                  if lc.GetFieldType() == FIELDTYPE_STRING:                  if layer.GetFieldType(field) == FIELDTYPE_STRING:
328                      value = self.encode(g.GetValue())                      value = self.encode(g.GetValue())
329                  else:                  else:
330                      value = str(g.GetValue())                      value = str(g.GetValue())

Legend:
Removed from v.1417  
changed lines
  Added in v.2104

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26