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 {