Mercurial > gemma
comparison pkg/imports/dmv.go @ 2633:eb1d119f253f
Fetch data from ERDMS for all allowed countries
This will enable a sys_admin to import data for all countries while
a waterway_admin still can only import data for his own country.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Wed, 13 Mar 2019 18:19:44 +0100 |
parents | 5f300bd7316f |
children | d9903cb34842 |
comparison
equal
deleted
inserted
replaced
2632:0b14de0bb85f | 2633:eb1d119f253f |
---|---|
15 | 15 |
16 import ( | 16 import ( |
17 "context" | 17 "context" |
18 "database/sql" | 18 "database/sql" |
19 "errors" | 19 "errors" |
20 "fmt" | |
21 "log" | |
22 "strings" | |
23 "time" | 20 "time" |
24 | 21 |
25 "gemma.intevation.de/gemma/pkg/models" | 22 "gemma.intevation.de/gemma/pkg/models" |
26 "gemma.intevation.de/gemma/pkg/soap" | |
27 "gemma.intevation.de/gemma/pkg/soap/erdms" | |
28 ) | 23 ) |
29 | 24 |
30 type DistanceMarksVirtual struct { | 25 type DistanceMarksVirtual struct { |
31 // URL is the URL of the SOAP service. | 26 // URL is the URL of the SOAP service. |
32 URL string `json:"url"` | 27 URL string `json:"url"` |
95 if err != nil { | 90 if err != nil { |
96 return nil, err | 91 return nil, err |
97 } | 92 } |
98 defer tx.Rollback() | 93 defer tx.Rollback() |
99 | 94 |
100 var country string | 95 responseData, err := getRisData( |
101 err = tx.QueryRowContext(ctx, selectCurrentUserCountrySQL).Scan(&country) | 96 tx, |
102 switch { | 97 ctx, |
103 case err == sql.ErrNoRows: | 98 feedback, |
104 return nil, errors.New("Cannot figure out user country") | 99 dmv.Username, |
105 case err != nil: | 100 dmv.Password, |
101 dmv.URL, | |
102 dmv.Insecure, | |
103 "dismar") | |
104 if err != nil { | |
106 return nil, err | 105 return nil, err |
107 } | |
108 | |
109 country = strings.ToUpper(country) | |
110 feedback.Info("Using country '%s'.", country) | |
111 | |
112 var auth *soap.BasicAuth | |
113 if dmv.Username != "" { | |
114 auth = &soap.BasicAuth{ | |
115 Login: dmv.Username, | |
116 Password: dmv.Password, | |
117 } | |
118 } | |
119 | |
120 client := erdms.NewRefService(dmv.URL, dmv.Insecure, auth) | |
121 | |
122 request := &erdms.GetRisDataXML{ | |
123 GetRisDataXMLType: &erdms.GetRisDataXMLType{ | |
124 Subcode: erdms.NoNS{Text: country + "%"}, | |
125 Funcode: erdms.NoNS{Text: "DISMAR"}, | |
126 }, | |
127 } | |
128 | |
129 data, err := client.GetRisDataXML(request) | |
130 | |
131 if err != nil { | |
132 log.Printf("error: %v\n", err) | |
133 return nil, fmt.Errorf("Error requesting ERDMS service: %v", err) | |
134 } | 106 } |
135 | 107 |
136 insertStmt, err := tx.PrepareContext(ctx, insertDistanceMarksVirtualSQL) | 108 insertStmt, err := tx.PrepareContext(ctx, insertDistanceMarksVirtualSQL) |
137 if err != nil { | 109 if err != nil { |
138 return nil, err | 110 return nil, err |
139 } | 111 } |
140 defer insertStmt.Close() | 112 defer insertStmt.Close() |
141 | 113 |
142 var ignored, features int | 114 var ignored, features int |
143 | 115 |
144 for _, dr := range data.RisdataReturn { | 116 for _, data := range responseData { |
145 if dr.RisidxCode == nil { | 117 for _, dr := range data.RisdataReturn { |
146 ignored++ | 118 if dr.RisidxCode == nil { |
147 continue | 119 ignored++ |
120 continue | |
121 } | |
122 | |
123 code, err := models.IsrsFromString(string(*dr.RisidxCode)) | |
124 if err != nil { | |
125 feedback.Warn("invalid ISRS code %v", err) | |
126 ignored++ | |
127 continue | |
128 } | |
129 | |
130 if dr.Lat == nil || dr.Lon == nil { | |
131 feedback.Warn("missing lat/lon: %s", code) | |
132 ignored++ | |
133 continue | |
134 } | |
135 | |
136 if dr.Relenc == nil { | |
137 feedback.Warn("missing relenc: %s", code) | |
138 ignored++ | |
139 continue | |
140 } | |
141 | |
142 if _, err := insertStmt.ExecContext( | |
143 ctx, | |
144 code.CountryCode, | |
145 code.LoCode, | |
146 code.FairwaySection, | |
147 code.Orc, | |
148 code.Hectometre, | |
149 float64(*dr.Lon), float64(*dr.Lat), | |
150 string(*dr.Relenc), | |
151 ); err != nil { | |
152 return nil, err | |
153 } | |
154 features++ | |
148 } | 155 } |
149 | |
150 code, err := models.IsrsFromString(string(*dr.RisidxCode)) | |
151 if err != nil { | |
152 feedback.Warn("invalid ISRS code %v", err) | |
153 ignored++ | |
154 continue | |
155 } | |
156 | |
157 if dr.Lat == nil || dr.Lon == nil { | |
158 feedback.Warn("missing lat/lon: %s", code) | |
159 ignored++ | |
160 continue | |
161 } | |
162 | |
163 if dr.Relenc == nil { | |
164 feedback.Warn("missing relenc: %s", code) | |
165 ignored++ | |
166 continue | |
167 } | |
168 | |
169 if _, err := insertStmt.ExecContext( | |
170 ctx, | |
171 code.CountryCode, | |
172 code.LoCode, | |
173 code.FairwaySection, | |
174 code.Orc, | |
175 code.Hectometre, | |
176 float64(*dr.Lon), float64(*dr.Lat), | |
177 string(*dr.Relenc), | |
178 ); err != nil { | |
179 return nil, err | |
180 } | |
181 features++ | |
182 } | 156 } |
183 feedback.Info("ignored: %d", ignored) | 157 feedback.Info("ignored: %d", ignored) |
184 feedback.Info("features: %d", features) | 158 feedback.Info("features: %d", features) |
185 | 159 |
186 if features == 0 { | 160 if features == 0 { |