66import sqlalchemy as sa
77from sqlalchemy import func , select , asc , desc
88from sqlalchemy .sql import text
9- from sqlalchemy .orm import joinedload , undefer
9+ from sqlalchemy .orm import joinedload , undefer , defer
1010from werkzeug .exceptions import BadRequest
1111
1212from ref_geo .env import db
@@ -173,23 +173,28 @@ def get_municipalities():
173173 return jsonify (MunicipalitySchema ().dump (municipalities , many = True ))
174174
175175
176+ # FIXME: Transform to post and change the post /areas
176177@routes .route ("/areas" , methods = ["GET" ])
177178def get_areas ():
178179 """
179180 Return the areas of ref_geo.l_areas
180181 .. :quickref: Ref Geo;
181182 """
182183 # change all args in a list of value
183- params = { key : request .args . getlist ( key ) for key , value in request . args . items ()}
184+ params = request .args
184185
186+ # allow to format response
187+ output_format = request .args .get ("format" , default = "" , type = str )
188+
189+ marsh_params = dict (as_geojson = (output_format == "geojson" ))
185190 query = (
186191 select (LAreas )
187192 .options (joinedload ("area_type" ).load_only ("type_code" ))
188193 .order_by (LAreas .area_name .asc ())
189194 )
190195
191196 if "enable" in params :
192- enable_param = params ["enable" ][ 0 ] .lower ()
197+ enable_param = params ["enable" ].lower ()
193198 accepted_enable_values = ["true" , "false" , "all" ]
194199 if enable_param not in accepted_enable_values :
195200 response = {
@@ -205,28 +210,35 @@ def get_areas():
205210 query = query .where (LAreas .enable == True )
206211
207212 if "id_type" in params :
208- query = query .where (LAreas .id_type .in_ (params [ "id_type" ] ))
213+ query = query .where (LAreas .id_type .in_ (params . getlist ( "id_type" ) ))
209214
210215 if "type_code" in params :
211- query = query .where (LAreas .area_type .has (BibAreasTypes .type_code .in_ (params ["type_code" ])))
216+ query = query .where (
217+ LAreas .area_type .has (BibAreasTypes .type_code .in_ (params .getlist ("type_code" )))
218+ )
212219
213220 if "area_name" in params :
214- query = query .where (LAreas .area_name .ilike ("%{}%" .format (params .get ("area_name" )[ 0 ] )))
221+ query = query .where (LAreas .area_name .ilike ("%{}%" .format (params .get ("area_name" ))))
215222
216- limit = int (params .get ("limit" )[0 ]) if params .get ("limit" ) else 100
223+ without_geom = params .get ("without_geom" , False , lambda x : x == "true" )
224+ if without_geom :
225+ query = query .options (defer ("geom" ))
226+ marsh_params ["exclude" ] = ["geom" ]
217227
218- # allow to format response
219- format = request .args .get ("format" , default = "" , type = str )
228+ limit = int (params .get ("limit" )[0 ]) if params .get ("limit" ) else 100
220229
221230 fields = {"area_type.type_code" }
222- if format == "geojson" :
231+ if output_format == "geojson" and not without_geom :
223232 fields |= {"+geom_4326" }
224233 query = query .options (undefer ("geom_4326" ))
225234
226235 areas = db .session .scalars (query .limit (limit )).unique ().all ()
227236
228- response = AreaSchema (only = fields , as_geojson = format == "geojson" ).dump (areas , many = True )
229- if format == "geojson" :
237+ marsh_params ["only" ] = fields
238+
239+ response = AreaSchema (** marsh_params ).dump (areas , many = True )
240+
241+ if output_format == "geojson" :
230242 # retro-compat: return a list of Features instead of the FeatureCollection
231243 response = response ["features" ]
232244 return response
0 commit comments