annotate RestDbInterface.py @ 22:1a4b56716902

NEW - # 12: create table and upload data https://it-dev.mpiwg-berlin.mpg.de/tracs/GIS/ticket/12 JSON data formats
author casties
date Thu, 19 Aug 2010 14:30:51 +0200
parents a67b7c1f7ec5
children 860ec92f99df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
1 '''
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
2 Created on 19.5.2010
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
3
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
4 @author: casties
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
5 '''
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
6
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
7 from OFS.Folder import Folder
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
8 from Products.PageTemplates.PageTemplateFile import PageTemplateFile
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
9 from Products.ZSQLExtend import ZSQLExtend
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
10 import logging
15
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
11 import re
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
12 import psycopg2
18
060797795a4d work on json return values
casties
parents: 17
diff changeset
13 import json
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
14 import time
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
15
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
16 from zope.interface import implements
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
17 from zope.publisher.interfaces import IPublishTraverse
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
18 from ZPublisher.BaseRequest import DefaultPublishTraverse
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
19 #from zope.publisher.interfaces import NotFound
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
20 #from zope.app import zapi
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
21 #from zope.component import queryMultiAdapter
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
22 import Shared.DC.ZRDB.DA
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
23 from Products.ZSQLMethods.SQL import SQLConnectionIDs
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
24
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
25
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
26 def getTextFromNode(node):
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
27 """get the cdata content of a XML node"""
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
28 if node is None:
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
29 return ""
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
30
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
31 if isinstance(node, list):
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
32 nodelist = node
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
33 else:
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
34 nodelist=node.childNodes
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
35
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
36 rc = ""
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
37 for node in nodelist:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
38 if node.nodeType == node.TEXT_NODE:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
39 rc = rc + node.data
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
40 return rc
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
41
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
42 def sqlName(s,lc=True):
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
43 """returns restricted ASCII-only version of string"""
15
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
44 if s is None:
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
45 return ""
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
46
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
47 # all else -> "_"
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
48 s = re.sub(r'[^A-Za-z0-9_]','_',s)
15
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
49 if lc:
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
50 return s.lower()
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
51
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
52 return s
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
53
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
54 class RestDbInterface(Folder):
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
55 """Object for RESTful database queries
7
bd52d9445a41 trying to rework
casties
parents: 5
diff changeset
56 path schema: /db/{schema}/{table}/
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
57 omitting table gives a list of schemas
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
58 omitting table and schema gives a list of schemas
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
59 """
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
60 implements(IPublishTraverse)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
61
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
62 meta_type="RESTdb"
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
63 manage_options=Folder.manage_options+(
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
64 {'label':'Config','action':'manage_editRestDbInterfaceForm'},
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
65 )
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
66
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
67 # management templates
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
68 manage_editRestDbInterfaceForm=PageTemplateFile('zpt/editRestDbInterface',globals())
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
69
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
70 # data templates
8
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
71 XML_index = PageTemplateFile('zpt/XML_index', globals())
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
72 XML_schema = PageTemplateFile('zpt/XML_schema', globals())
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
73 XML_schema_table = PageTemplateFile('zpt/XML_schema_table', globals())
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
74 HTML_index = PageTemplateFile('zpt/HTML_index', globals())
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
75 HTML_schema = PageTemplateFile('zpt/HTML_schema', globals())
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
76 HTML_schema_table = PageTemplateFile('zpt/HTML_schema_table', globals())
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
77 JSONHTML_index = PageTemplateFile('zpt/JSONHTML_index', globals())
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
78 JSONHTML_schema = PageTemplateFile('zpt/JSONHTML_schema', globals())
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
79 JSONHTML_schema_table = PageTemplateFile('zpt/JSONHTML_schema_table', globals())
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
80
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
81
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
82
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
83 def __init__(self, id, title, connection_id=None):
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
84 """init"""
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
85 self.id = id
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
86 self.title = title
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
87 # database connection id
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
88 self.connection_id = connection_id
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
89 # create template folder
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
90 self.manage_addFolder('template')
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
91
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
92
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
93 def getJsonString(self,object):
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
94 """returns a JSON formatted string from object"""
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
95 return json.dumps(object)
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
96
17
ed997e639cfd more upload table
casties
parents: 16
diff changeset
97 def getCursor(self,autocommit=True):
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
98 """returns fresh DB cursor"""
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
99 conn = getattr(self,"_v_database_connection",None)
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
100 if conn is None:
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
101 # create a new connection object
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
102 try:
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
103 if self.connection_id is None:
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
104 # try to take the first existing ID
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
105 connids = SQLConnectionIDs(self)
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
106 if len(connids) > 0:
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
107 connection_id = connids[0][0]
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
108 self.connection_id = connection_id
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
109 logging.debug("connection_id: %s"%repr(connection_id))
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
110
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
111 da = getattr(self, self.connection_id)
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
112 da.connect('')
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
113 # we copy the DAs database connection
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
114 conn = da._v_database_connection
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
115 #conn._register() # register with the Zope transaction system
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
116 self._v_database_connection = conn
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
117 except Exception, e:
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
118 raise IOError("No database connection! (%s)"%str(e))
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
119
5
7539a9e69365 small fix
casties
parents: 4
diff changeset
120 cursor = conn.getcursor()
17
ed997e639cfd more upload table
casties
parents: 16
diff changeset
121 if autocommit:
ed997e639cfd more upload table
casties
parents: 16
diff changeset
122 # is there a better version to get to the connection?
ed997e639cfd more upload table
casties
parents: 16
diff changeset
123 cursor.connection.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
ed997e639cfd more upload table
casties
parents: 16
diff changeset
124
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
125 return cursor
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
126
17
ed997e639cfd more upload table
casties
parents: 16
diff changeset
127 def executeSQL(self, query, args=None, hasResult=True, autocommit=True):
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
128 """execute query with args on database and return all results.
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
129 result format: {"fields":fields, "rows":data}"""
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
130 logging.debug("executeSQL query=%s args=%s"%(query,args))
17
ed997e639cfd more upload table
casties
parents: 16
diff changeset
131 cur = self.getCursor(autocommit=autocommit)
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
132 cur.execute(query, args)
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
133 # description of returned fields
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
134 fields = cur.description
17
ed997e639cfd more upload table
casties
parents: 16
diff changeset
135 if hasResult:
ed997e639cfd more upload table
casties
parents: 16
diff changeset
136 # get all data in an array
ed997e639cfd more upload table
casties
parents: 16
diff changeset
137 data = cur.fetchall()
ed997e639cfd more upload table
casties
parents: 16
diff changeset
138 cur.close()
ed997e639cfd more upload table
casties
parents: 16
diff changeset
139 return {"fields":fields, "rows":data}
ed997e639cfd more upload table
casties
parents: 16
diff changeset
140 else:
ed997e639cfd more upload table
casties
parents: 16
diff changeset
141 cur.close()
ed997e639cfd more upload table
casties
parents: 16
diff changeset
142 return None
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
143
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
144
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
145 def publishTraverse(self,request,name):
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
146 """change the traversal"""
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
147 # get stored path
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
148 path = request.get('restdb_path', [])
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
149 logging.debug("publishtraverse: name=%s restdb_path=%s"%(name,path))
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
150
13
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
151 if name in ("index_html", "PUT"):
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
152 # end of traversal
13
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
153 if request.get("method") == "POST" and request.get("action",None) == "PUT":
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
154 # fake PUT by POST with action=PUT
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
155 name = "PUT"
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
156
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
157 return getattr(self, name)
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
158 #TODO: should we check more?
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
159 else:
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
160 # traverse
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
161 if len(path) == 0:
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
162 # first segment
8
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
163 if name == 'db':
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
164 # virtual path -- continue traversing
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
165 path = [name]
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
166 request['restdb_path'] = path
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
167 else:
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
168 # try real path
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
169 tr = DefaultPublishTraverse(self, request)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
170 ob = tr.publishTraverse(request, name)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
171 return ob
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
172 else:
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
173 path.append(name)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
174
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
175 # continue traversing
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
176 return self
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
177
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
178 def index_html(self,REQUEST,RESPONSE):
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
179 """index method"""
8
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
180 # ReST path was stored in request
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
181 path = REQUEST.get('restdb_path',[])
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
182
8
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
183 # type and format are real parameter
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
184 format = REQUEST.get('format','HTML').upper()
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
185 type = REQUEST.get('type',None)
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
186
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
187 # id and doc are used for GoogleMaps content
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
188 id = REQUEST.get('id',[])
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
189 doc = REQUEST.get('doc',None)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
190
8
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
191 logging.debug("index_html path=%s format=%s type=%s"%(path,format,type))
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
192
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
193 if type is not None:
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
194 # non-empty type -- look for template
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
195 pt = getattr(self.template, "%s_%s"%(format,type), None)
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
196 if pt is not None:
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
197 return pt(format=format,type=type,path=path)
a9a49f5765c9 reworking templates and schema
casties
parents: 7
diff changeset
198
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
199 if len(path) == 1:
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
200 # list of schemas
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
201 return self.showListOfSchemas(format=format,REQUEST=REQUEST,RESPONSE=RESPONSE)
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
202 elif len(path) == 2:
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
203 # list of tables
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
204 return self.showListOfTables(format=format,schema=path[1],REQUEST=REQUEST,RESPONSE=RESPONSE)
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
205 elif len(path) == 3:
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
206 # table
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
207 return self.showTable(format=format,schema=path[1],table=path[2],REQUEST=REQUEST,RESPONSE=RESPONSE)
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
208
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
209 # don't know what to do
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
210 return str(REQUEST)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
211
12
0fa22c291ff1 NEW - # 12: create table and upload data
casties
parents: 9
diff changeset
212 def PUT(self, REQUEST, RESPONSE):
0fa22c291ff1 NEW - # 12: create table and upload data
casties
parents: 9
diff changeset
213 """
0fa22c291ff1 NEW - # 12: create table and upload data
casties
parents: 9
diff changeset
214 Implement WebDAV/HTTP PUT/FTP put method for this object.
0fa22c291ff1 NEW - # 12: create table and upload data
casties
parents: 9
diff changeset
215 """
13
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
216 logging.debug("RestDbInterface PUT")
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
217 #logging.debug("req=%s"%REQUEST)
12
0fa22c291ff1 NEW - # 12: create table and upload data
casties
parents: 9
diff changeset
218 #self.dav__init(REQUEST, RESPONSE)
0fa22c291ff1 NEW - # 12: create table and upload data
casties
parents: 9
diff changeset
219 #self.dav__simpleifhandler(REQUEST, RESPONSE)
13
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
220 # ReST path was stored in request
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
221 path = REQUEST.get('restdb_path',[])
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
222 if len(path) == 3:
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
223 schema = path[1]
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
224 tablename = path[2]
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
225 file = REQUEST.get("create_table_file",None)
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
226 if file is None:
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
227 RESPONSE.setStatus(400)
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
228 return
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
229
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
230 logging.debug("put with schema=%s table=%s file=%s"%(schema,tablename,file))
17
ed997e639cfd more upload table
casties
parents: 16
diff changeset
231 ret = self.createTableFromXML(schema, tablename, file)
20
67ca17753cd5 NEW - # 12: create table and upload data
casties
parents: 18
diff changeset
232 resultType = REQUEST.get("result_type","application/json")
67ca17753cd5 NEW - # 12: create table and upload data
casties
parents: 18
diff changeset
233 if resultType == "application/json":
67ca17753cd5 NEW - # 12: create table and upload data
casties
parents: 18
diff changeset
234 RESPONSE.setHeader("Content-Type", "application/json")
67ca17753cd5 NEW - # 12: create table and upload data
casties
parents: 18
diff changeset
235 json.dump(ret, RESPONSE)
67ca17753cd5 NEW - # 12: create table and upload data
casties
parents: 18
diff changeset
236 elif resultType == "html/json":
67ca17753cd5 NEW - # 12: create table and upload data
casties
parents: 18
diff changeset
237 RESPONSE.setHeader("Content-Type", "text/html")
67ca17753cd5 NEW - # 12: create table and upload data
casties
parents: 18
diff changeset
238 RESPONSE.write("<html>\n<body>\n<pre>")
67ca17753cd5 NEW - # 12: create table and upload data
casties
parents: 18
diff changeset
239 json.dump(ret, RESPONSE)
67ca17753cd5 NEW - # 12: create table and upload data
casties
parents: 18
diff changeset
240 RESPONSE.write("</pre>\n</body>\n</html>")
67ca17753cd5 NEW - # 12: create table and upload data
casties
parents: 18
diff changeset
241
13
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
242
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
243 else:
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
244 # 400 Bad Request
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
245 RESPONSE.setStatus(400)
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
246 return
12
0fa22c291ff1 NEW - # 12: create table and upload data
casties
parents: 9
diff changeset
247
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
248
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
249 def showTable(self,format='XML',schema='public',table=None,REQUEST=None,RESPONSE=None):
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
250 """returns PageTemplate with tables"""
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
251 logging.debug("showtable")
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
252 # GIS gets special treatment
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
253 if format=="GIS":
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
254 return self.showGoogleMap(schema=path[1],table=path[2],id=id,doc=doc)
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
255
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
256 # JSON gets special treatment
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
257 if format == "JSON":
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
258 data = self.getListOfTables(schema)
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
259 RESPONSE.setHeader("Content-Type", "application/json")
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
260 json.dump(data, RESPONSE)
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
261 return
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
262
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
263 # everything else has its own template
9
76ac7a721273 more rework of templates
casties
parents: 8
diff changeset
264 pt = getattr(self.template, '%s_schema_table'%format, None)
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
265 if pt is None:
9
76ac7a721273 more rework of templates
casties
parents: 8
diff changeset
266 return "ERROR!! template %s_schema_table not found"%format
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
267
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
268 data = self.getTable(schema,table)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
269 return pt(data=data,tablename=table)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
270
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
271 def getTable(self,schema='public',table=None,username='guest'):
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
272 """return table data"""
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
273 logging.debug("gettable")
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
274 data = self.executeSQL('select * from "%s"."%s"'%(schema,table))
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
275 return data
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
276
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
277 def showListOfTables(self,format='XML',schema='public',REQUEST=None,RESPONSE=None):
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
278 """returns PageTemplate with list of tables"""
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
279 logging.debug("showlistoftables")
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
280 # JSON gets special treatment
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
281 if format == "JSON":
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
282 data = self.getListOfTables(schema)
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
283 RESPONSE.setHeader("Content-Type", "application/json")
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
284 json.dump(data, RESPONSE)
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
285 return
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
286
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
287 # everything else has its own template
9
76ac7a721273 more rework of templates
casties
parents: 8
diff changeset
288 pt = getattr(self.template, '%s_schema'%format, None)
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
289 if pt is None:
9
76ac7a721273 more rework of templates
casties
parents: 8
diff changeset
290 return "ERROR!! template %s_schema not found"%format
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
291
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
292 data = self.getListOfTables(schema)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
293 return pt(data=data,schema=schema)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
294
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
295 def getListOfTables(self,schema='public',username='guest'):
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
296 """return list of tables"""
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
297 logging.debug("getlistoftables")
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
298 # get list of fields and types of db table
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
299 qstr="""SELECT c.relname AS tablename FROM pg_catalog.pg_class c
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
300 LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
301 WHERE c.relkind IN ('r','') AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
302 AND pg_catalog.pg_table_is_visible(c.oid)"""
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
303 #qstr="select attname, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) from pg_attribute, pg_class where attrelid = pg_class.oid and pg_attribute.attnum > 0"
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
304 data=self.executeSQL(qstr)
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
305 return data
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
306
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
307 def showListOfSchemas(self,format='XML',REQUEST=None,RESPONSE=None):
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
308 """returns PageTemplate with list of schemas"""
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
309 logging.debug("showlistofschemas")
22
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
310 # JSON gets special treatment
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
311 if format == "JSON":
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
312 data = self.getListOfSchemas()
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
313 RESPONSE.setHeader("Content-Type", "application/json")
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
314 json.dump(data, RESPONSE)
1a4b56716902 NEW - # 12: create table and upload data
casties
parents: 21
diff changeset
315 return
9
76ac7a721273 more rework of templates
casties
parents: 8
diff changeset
316 pt = getattr(self.template, '%s_index'%format, None)
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
317 if pt is None:
9
76ac7a721273 more rework of templates
casties
parents: 8
diff changeset
318 return "ERROR!! template %s_index not found"%format
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
319
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
320 data = self.getListOfSchemas()
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
321 return pt(data=data)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
322
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
323 def getListOfSchemas(self,username='guest'):
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
324 """return list of schemas"""
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
325 logging.debug("getlistofschemas")
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
326 # TODO: really look up schemas
9
76ac7a721273 more rework of templates
casties
parents: 8
diff changeset
327 data={'fields': (('schemas',),), 'rows': [('public',),]}
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
328 return data
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
329
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
330 def createEmptyTable(self,schema,table,fields):
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
331 """create a table with the given fields
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
332 returns list of created fields"""
15
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
333 logging.debug("createEmptyTable")
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
334 sqlFields = []
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
335 for f in fields:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
336 if isinstance(f,dict):
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
337 # {name: XX, type: YY}
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
338 name = sqlName(f['name'])
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
339 type = f['type']
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
340
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
341 else:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
342 # name only
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
343 name = sqlName(f)
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
344 type = 'text'
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
345
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
346 sqlFields.append({'name':name, 'type':type})
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
347
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
348 # drop table if it exists
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
349 try:
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
350 res = self.executeSQL('select * from "%s"."%s" where 1=0'%(schema,table))
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
351 logging.debug("createemptytable: table %s.%s exists"%(schema,table))
17
ed997e639cfd more upload table
casties
parents: 16
diff changeset
352 self.executeSQL('drop table "%s"."%s"'%(schema,table),hasResult=False)
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
353 except:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
354 pass
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
355
15
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
356 fieldString = ", ".join(['"%s" %s'%(f['name'],f['type']) for f in sqlFields])
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
357 sqlString = 'create table "%s"."%s" (%s)'%(schema,table,fieldString)
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
358 logging.debug("createemptytable: SQL=%s"%sqlString)
17
ed997e639cfd more upload table
casties
parents: 16
diff changeset
359 ret = self.executeSQL(sqlString,hasResult=False)
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
360
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
361 return sqlFields
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
362
13
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
363 def createTableFromXML(self,schema,table,data):
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
364 """create or replace a table with the given XML data"""
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
365 logging.debug("createTableFromXML schema=%s table=%s data=%s"%(schema,table,data))
17
ed997e639cfd more upload table
casties
parents: 16
diff changeset
366 tablename = sqlName(table)
ed997e639cfd more upload table
casties
parents: 16
diff changeset
367 self.importExcelXML(schema,tablename, data)
ed997e639cfd more upload table
casties
parents: 16
diff changeset
368 return {"tablename": tablename}
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
369
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
370 def importExcelXML(self,schema,table,xmldata,fieldNamesOnly=False):
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
371 '''
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
372 Import XML file in Excel format into the table
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
373 @param table: name of the table the xml shall be imported into
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
374 @param containerTagName: XML-Tag which describes a dataset
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
375 @param data: data to be imported
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
376 @param identify: (optional) field res. tag which identifies a entry uniquely for updating purposes.
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
377 @param RESPONSE: (optional)
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
378 '''
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
379 from xml.dom.pulldom import parseString,parse
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
380
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
381 namespace = "urn:schemas-microsoft-com:office:spreadsheet"
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
382 containerTagName = "Table"
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
383 rowTagName = "Row"
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
384 colTagName = "Cell"
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
385 dataTagName = "Data"
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
386 fieldNames = []
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
387 sqlFields = []
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
388 numFields = 0
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
389 sqlInsert = None
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
390
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
391 logging.debug("import excel xml")
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
392
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
393 ret=""
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
394 if isinstance(xmldata, str):
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
395 logging.debug("importXML reading string data")
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
396 doc=parseString(xmldata)
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
397 else:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
398 logging.debug("importXML reading file data")
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
399 doc=parse(xmldata)
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
400
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
401 cnt = 0
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
402 while True:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
403 node=doc.getEvent()
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
404
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
405 if node is None:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
406 break
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
407
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
408 else:
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
409 #logging.debug("tag=%s"%node[1].localName)
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
410 if node[1].localName is not None:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
411 tagName = node[1].localName.lower()
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
412 else:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
413 # ignore non-tag nodes
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
414 continue
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
415
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
416 if tagName == rowTagName.lower():
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
417 # start of row
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
418 doc.expandNode(node[1])
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
419 cnt += 1
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
420 if cnt == 1:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
421 # first row -- field names
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
422 names=node[1].getElementsByTagNameNS(namespace, dataTagName)
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
423 for name in names:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
424 fn = getTextFromNode(name)
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
425 fieldNames.append(fn)
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
426
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
427 if fieldNamesOnly:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
428 # return just field names
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
429 return fieldNames
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
430
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
431 # create table
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
432 sqlFields = self.createEmptyTable(schema, table, fieldNames)
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
433 numFields = len(sqlFields)
15
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
434 fieldString = ", ".join(['"%s"'%f['name'] for f in sqlFields])
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
435 valString = ", ".join(["%s" for f in sqlFields])
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
436 sqlInsert = 'insert into "%s"."%s" (%s) values (%s)'%(schema,table,fieldString,valString)
15
5e3edf980813 more work on xml import
casties
parents: 14
diff changeset
437 logging.debug("importexcelsql: sqlInsert=%s"%sqlInsert)
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
438
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
439 else:
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
440 # following rows are data
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
441 colNodes=node[1].getElementsByTagNameNS(namespace, colTagName)
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
442 data = []
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
443 hasData = False
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
444 for colNode in colNodes:
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
445 dataNodes=colNode.getElementsByTagNameNS(namespace, dataTagName)
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
446 if len(dataNodes) > 0:
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
447 val = getTextFromNode(dataNodes[0])
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
448 hasData = True
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
449 else:
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
450 val = None
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
451
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
452 data.append(val)
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
453
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
454 if not hasData:
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
455 # ignore empty rows
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
456 continue
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
457
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
458 # fix number of data fields
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
459 if len(data) > numFields:
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
460 del data[numFields:]
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
461 elif len(data) < numFields:
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
462 missFields = numFields - len(data)
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
463 data.extend(missFields * [None,])
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
464
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
465 logging.debug("importexcel sqlinsert=%s data=%s"%(sqlInsert,data))
17
ed997e639cfd more upload table
casties
parents: 16
diff changeset
466 self.executeSQL(sqlInsert, data, hasResult=False)
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
467
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
468 return cnt
21
a67b7c1f7ec5 Merge with Falks GIS stuff 78e70dfa7ad6b27d10d490f9ae8820306e4fe5d4
casties
parents: 20 19
diff changeset
469
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
470 # Methods for GoogleMaps creation
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
471 def showGoogleMap(self,schema='chgis',table='mpdl',id=[],doc=None):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
472 logging.debug("showGoogleMap")
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
473 data = self.getDataForGoogleMap(schema,table,id,doc)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
474 kml=self.getKMLname(data=data,table=table)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
475 googleMap_page=self.htmlHead()+str(self.getGoogleMapString(kml=kml))
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
476 return googleMap_page
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
477
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
478 def getDataForGoogleMap(self,schema='chgis',table='mpdl',id=[],doc=None):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
479 logging.debug("getDataForGoogleMap")
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
480 qstr="SELECT * FROM "+schema+"."+table
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
481 try:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
482 if id!=[]:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
483 qstr=qstr+" WHERE "
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
484 for id_item in id.split(","):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
485 if table=='mpdl':
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
486 qstr=qstr+" mpdl_xmlsource_id = '"+id_item+ "' OR"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
487 else:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
488 qstr=qstr+" cast(id as text) LIKE '"+id_item+ "' OR"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
489 qstr=str(qstr).rsplit(" ",1)[0] #to remove last " and "
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
490 data=self.ZSQLSimpleSearch(qstr)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
491 return data
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
492 except:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
493 return qstr
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
494
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
495 def getKMLname(self,data=[],table=""):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
496 logging.debug("getKMLname")
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
497 #session=context.REQUEST.SESSION
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
498 kml4Marker="<kml xmlns=\'http://www.opengis.net/kml/2.2\'><Document><Style id=\'marker_icon\'><IconStyle><scale>15</scale><Icon><href>http://chinagis.mpiwg-berlin.mpg.de/chinagis/images/dot_red.png</href></Icon></IconStyle></Style>\n"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
499 initializeStringForGoogleMaps=""
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
500 #doLine=container.getVar('doLine')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
501 # Mapping a set of points from table-based SQL-query:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
502 if data!=None:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
503 try:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
504 SQL="""SELECT \"attribute with gis_id\" FROM public.metadata WHERE tablename LIKE '"""+table+"""'"""
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
505 gisIDattribute=self.ZSQLSimpleSearch(SQL)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
506 except:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
507 return "table not registered within metadata"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
508 for dataset in data:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
509 try:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
510 xCoord=getattr(dataset,'longitude')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
511 yCoord=getattr(dataset,'latitude')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
512 except:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
513 try:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
514 xCoord=getattr(dataset,'x_coord')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
515 yCoord=getattr(dataset,'y_coord')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
516 except:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
517 # try:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
518 gisID=getattr(dataset,getattr(gisIDattribute[0],'attribute with gis_id'))
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
519 coords=self.getPoint4GISid(gisID)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
520 if coords!=None:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
521 xCoord=coords[0]
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
522 yCoord=coords[1]
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
523 # except:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
524 # return "no coordinates found"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
525 if float(xCoord)!=0:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
526 if float(yCoord)!=0:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
527 kml4Marker=kml4Marker+"<Placemark>"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
528 kml4Marker=kml4Marker+"<description> <![CDATA[<b>"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
529 for values in dataset:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
530 if values != (None, None):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
531 if str(values).find('name')>-1:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
532 kml4Marker=kml4Marker+"<name>"+str(values[1])+"</name>\n"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
533 continue
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
534 elif str(values).find('place')>-1:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
535 kml4Marker=kml4Marker+"<name>"+str(values[1])+"</name>\n"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
536 continue
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
537
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
538 kml4Marker=kml4Marker+str(values)+": "
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
539 attribute_string=str(values).replace("'","__Apostroph__")
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
540 attribute_string=str(attribute_string).replace('"','__DoubleApostroph__')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
541 attribute_string=str(attribute_string).replace(';','__$$__')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
542 attribute_string=str(attribute_string).replace('&','&amp;')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
543 if str(attribute_string).find('http')>-1:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
544 attribute_string='<A HREF=' + str(attribute_string) + ' target=_blank>' + str(attribute_string) + '</A>'
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
545 kml4Marker=kml4Marker+attribute_string+"</a><br>\n"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
546
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
547 kml4Marker=kml4Marker+"]]></description>\n"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
548 kml4Marker=kml4Marker+"<styleURL>#marker_icon</styleURL>\n"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
549 kml4Marker=kml4Marker+"<Point>"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
550
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
551 kml4Marker=kml4Marker+"<coordinates>"+str(xCoord)+","+str(yCoord)+",0</coordinates>\n"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
552 kml4Marker=kml4Marker+"</Point>\n"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
553 kml4Marker=kml4Marker+"</Placemark>\n"
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
554
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
555 kml4Marker=kml4Marker+"</Document>\n</kml>"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
556 kmlFileName="marker"+str(time.time())+".kml"
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
557
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
558 # kml4Marker=str(kml4Marker).replace('&','$$')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
559 # kml4Marker=str(kml4Marker).replace(';','__$$__')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
560 # kml4Marker=str(kml4Marker).replace('#','__SHARP__')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
561 initializeStringForGoogleMaps="""onload=\"initialize(\'http://chinagis.mpiwg-berlin.mpg.de/chinagis/REST/daten/"""+kmlFileName+"""\')\""""#+str(data)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
562 initializeStringForGoogleMaps=initializeStringForGoogleMaps.replace("None","0")
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
563 isLoadReady='false'
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
564 while isLoadReady=='false':
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
565 isLoadReady=self.RESTwrite2File(self.daten,kmlFileName,kml4Marker)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
566
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
567 return initializeStringForGoogleMaps
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
568
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
569 def getGoogleMapString(self,kml):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
570 logging.debug("getGoogleMapString")
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
571 printed= '<body %s> '%kml +"""\n <div id="map_canvas" style="width: 98%; height: 95%"> </div> \n </body>" \n </html>"""
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
572 return printed
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
573
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
574 def getPoint4GISid(self,gis_id):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
575 j=0
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
576 while (True):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
577 j=j+1
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
578 if (j>100): # FJK: just to prevent endless loops
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
579 break
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
580 if (gis_id.isdigit()): # FJK: regular exit from while-loop
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
581 break
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
582 else:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
583 gis_id=gis_id.strip('abcdefghijklmnopqrstuvwxyz_') # FJK: to strip all letters
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
584 gis_id=gis_id.strip() # FJK: to strip all whitespaces
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
585 resultpoint = [0,0]
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
586 results = None
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
587 try:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
588 if int(gis_id)>0:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
589 SQL="SELECT x_coord,y_coord FROM chgis.chgis_coords WHERE gis_id LIKE cast("+ str(gis_id) +" as text);"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
590 results=self.ZSQLSimpleSearch(SQL)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
591 #print results
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
592 if results != None:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
593 for result in results:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
594 resultpoint=[getattr(result,str('x_coord')),getattr(result,str('y_coord'))]
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
595 if resultpoint !=[0,0]:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
596 return resultpoint
14
05933707897f NEW - # 12: create table and upload data
casties
parents: 13
diff changeset
597 else:
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
598 coords=self.getCoordsFromREST_gisID(joinid)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
599 SQL="INSERT INTO chgis.chgis_coords (gis_id,x_coord,y_coord) VALUES (" +gis_id+ "," +coords[0][1]+ "," +coords[0][0]+ "); ANALYZE chgis.chgis_coords;"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
600 returnstring=self.ZSQLSimpleSearch(SQL)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
601 return coords[0]
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
602 except:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
603 error="gis_id not to interpretable:"+str(gis_id)
16
cbb73d103152 NEW - # 12: create table and upload data
casties
parents: 15
diff changeset
604
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
605 def getCoordsFromREST_gisID(self,gis_id):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
606 coordlist=[]
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
607 i=0
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
608 while (i<5 and coordlist==[]):
13
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
609
19
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
610 urlresponse=container.urlFunctions.zUrlopenParseString(container.urlFunctions.zUrlopenRead("http://chgis.hmdc.harvard.edu/xml/id/"+gis_id))
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
611 baseDocElement=container.urlFunctions.zUrlopenDocumentElement(urlresponse)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
612 childnodes=container.urlFunctions.zUrlopenChildNodes(baseDocElement)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
613 itemnodes=container.urlFunctions.zUrlopenGetElementsByTagName(baseDocElement,'item')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
614
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
615 for i in range(0,container.urlFunctions.zUrlopenLength(itemnodes)):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
616 itemnode=container.urlFunctions.zUrlopenGetItem(itemnodes,i)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
617 itemspatialnodes=container.urlFunctions.zUrlopenGetElementsByTagName(itemnode,'spatial')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
618 for j in range(0,container.urlFunctions.zUrlopenLength(itemspatialnodes)):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
619 coord=[]
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
620 itemspatialnode= container.urlFunctions.zUrlopenGetItem(itemspatialnodes,j)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
621 itemspatiallatnodes=container.urlFunctions.zUrlopenGetElementsByTagName(itemspatialnode,'degrees_latitude')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
622 for k in range(0,container.urlFunctions.zUrlopenLength(itemspatiallatnodes)):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
623 itemspatiallatnode= container.urlFunctions.zUrlopenGetItem(itemspatiallatnodes,k)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
624 coord.append(container.urlFunctions.zUrlopenGetTextData(itemspatiallatnode))
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
625 itemspatiallngnodes=container.urlFunctions.zUrlopenGetElementsByTagName(itemspatialnode,'degrees_longitude')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
626 for k in range(0,container.urlFunctions.zUrlopenLength(itemspatiallngnodes)):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
627 itemspatiallngnode= container.urlFunctions.zUrlopenGetItem(itemspatiallngnodes,k)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
628 coord.append(container.urlFunctions.zUrlopenGetTextData(itemspatiallngnode))
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
629 coordlist.append(coord)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
630 gis_id= "_"+gis_id
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
631 return coordlist
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
632
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
633 # End for GoogleMaps creation
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
634
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
635 def RESTwrite2File(self,datadir, name,text):
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
636 # try:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
637 fileid=name
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
638 if fileid in datadir.objectIds():
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
639 datadir.manage_delObjects(fileid)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
640 newfile=open(name,'w')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
641 newfile.write(text)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
642 newfile.close()
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
643 file4Read=open(name,'r')
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
644 fileInZope=datadir.manage_addFile(id=fileid,file=file4Read)
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
645 return "Write successful"
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
646 # except:
78e70dfa7ad6 GoogleMaps related functions
fknauft
parents: 18
diff changeset
647 # return "Could not write"
13
e2c73c077533 NEW - # 12: create table and upload data
casties
parents: 12
diff changeset
648
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
649
4
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
650 def manage_editRestDbInterface(self, title=None, connection_id=None,
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
651 REQUEST=None):
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
652 """Change the object"""
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
653 if title is not None:
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
654 self.title = title
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
655
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
656 if connection_id is not None:
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
657 self.connection_id = connection_id
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
658
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
659 #checkPermission=getSecurityManager().checkPermission
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
660 REQUEST.RESPONSE.redirect('manage_main')
e3ee1f358fe6 new version that doesn't use ZSQLExtend but the database connection more directly.
casties
parents: 2
diff changeset
661
2
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
662
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
663 manage_addRestDbInterfaceForm=PageTemplateFile('zpt/addRestDbInterface',globals())
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
664
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
665 def manage_addRestDbInterface(self, id, title='', label='', description='',
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
666 createPublic=0,
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
667 createUserF=0,
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
668 REQUEST=None):
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
669 """Add a new object with id *id*."""
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
670
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
671 ob=RestDbInterface(str(id),title)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
672 self._setObject(id, ob)
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
673
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
674 #checkPermission=getSecurityManager().checkPermission
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
675 REQUEST.RESPONSE.redirect('manage_main')
61a3764cd5fb new version RestDbInterface with working traversal and templates
casties
parents:
diff changeset
676
5
7539a9e69365 small fix
casties
parents: 4
diff changeset
677