def update_observation(): try: update_data = request.form update_obs = {} for prop in ["cd_nom", "count", "comment", "date"]: update_obs[prop] = update_data[prop] try: _coordinates = json.loads(update_data["geometry"]) _point = Point(_coordinates["x"], _coordinates["y"]) _shape = asShape(_point) update_obs["geom"] = from_shape(Point(_shape), srid=4326) update_obs["municipality"] = get_municipality_id_from_wkb( update_obs['geom']) except Exception as e: current_app.logger.warning("[post_observation] coords ", e) raise GeonatureApiError(e) ObservationModel.query.filter_by( id_observation=update_data.get('id_observation')).update( update_obs, synchronize_session='fetch') db.session.commit() return ('observation updated successfully'), 200 except Exception as e: current_app.logger.critical("[post_observation] Error: %s", str(e)) return {"message": str(e)}, 400
def update_observation(): try: update_data = request.form update_obs = {} for prop in ["cd_nom", "count", "comment", "date"]: update_obs[prop] = update_data[prop] try: _coordinates = json.loads(update_data["geometry"]) _point = Point(_coordinates["x"], _coordinates["y"]) _shape = asShape(_point) update_obs["geom"] = from_shape(Point(_shape), srid=4326) update_obs["municipality"] = get_municipality_id_from_wkb( update_obs["geom"]) except Exception as e: current_app.logger.warning("[post_observation] coords ", e) raise GeonatureApiError(e) try: json_data = update_data.get("json_data") if json_data is not None: update_obs["json_data"] = json.loads(json_data) except Exception as e: current_app.logger.warning("[update_observation] json_data ", e) raise GeonatureApiError(e) ObservationModel.query.filter_by( id_observation=update_data.get("id_observation")).update( update_obs, synchronize_session="fetch") try: # Delete selected existing media id_media_to_delete = json.loads(update_data.get("delete_media")) if len(id_media_to_delete): db.session.query(ObservationMediaModel).filter( ObservationMediaModel.id_media.in_( tuple(id_media_to_delete)), ObservationMediaModel.id_data_source == update_data.get( "id_observation"), ).delete(synchronize_session="fetch") db.session.query(MediaModel).filter( MediaModel.id_media.in_(tuple(id_media_to_delete))).delete( synchronize_session="fetch") except Exception as e: current_app.logger.warning("[update_observation] delete media ", e) raise GeonatureApiError(e) try: file = save_upload_files( request.files, "obstax", update_data.get("cd_nom"), update_data.get("id_observation"), ObservationMediaModel, ) current_app.logger.debug( "[post_observation] ObsTax UPLOAD FILE {}".format(file)) except Exception as e: current_app.logger.warning( "[post_observation] ObsTax ERROR ON FILE SAVING", str(e)) # raise GeonatureApiError(e) db.session.commit() return ("observation updated successfully"), 200 except Exception as e: current_app.logger.critical("[post_observation] Error: %s", str(e)) return {"message": str(e)}, 400
def post_observation(): """Post a observation add a observation to database --- tags: - observations # security: # - bearerAuth: [] summary: Creates a new observation (JWT auth optional, if used, obs_txt replaced by username) consumes: - application/json - multipart/form-data produces: - application/json parameters: - name: json in: body description: JSON parameters. required: true schema: id: observation required: - cd_nom - date - geom properties: id_program: type: string description: Program unique id example: 1 default: 1 cd_nom: type: string description: CD_Nom Taxref example: 3582 obs_txt: type: string default: none description: User name required: false example: Martin Dupont count: type: integer description: Number of individuals default: none example: 1 date: type: string description: Date required: false example: "2018-09-20" geometry: type: string description: Geometry (GeoJson format) example: {"type":"Point", "coordinates":[5,45]} responses: 200: description: Adding a observation """ try: request_datas = request.form current_app.logger.debug("[post_observation] request data:", request_datas) datas2db = {} for field in request_datas: if hasattr(ObservationModel, field): datas2db[field] = request_datas[field] current_app.logger.debug("[post_observation] datas2db: %s", datas2db) try: newobs = ObservationModel(**datas2db) except Exception as e: current_app.logger.warning("[post_observation] data2db ", e) raise GeonatureApiError(e) try: _coordinates = json.loads(request_datas["geometry"]) _point = Point(_coordinates["x"], _coordinates["y"]) _shape = asShape(_point) newobs.geom = from_shape(Point(_shape), srid=4326) except Exception as e: current_app.logger.warning("[post_observation] coords ", e) raise GeonatureApiError(e) try: json_data = request_datas.get("json_data") if json_data is not None: newobs.json_data = json.loads(json_data) except Exception as e: current_app.logger.warning("[post_observation] json_data ", e) raise GeonatureApiError(e) id_role = get_id_role_if_exists() if id_role: newobs.id_role = id_role role = UserModel.query.get(id_role) newobs.obs_txt = role.username newobs.email = role.email else: if newobs.obs_txt is None or len(newobs.obs_txt) == 0: newobs.obs_txt = "Anonyme" newobs.municipality = get_municipality_id_from_wkb(newobs.geom) newobs.uuid_sinp = uuid.uuid4() db.session.add(newobs) db.session.commit() current_app.logger.debug(newobs.as_dict()) # Réponse en retour features = generate_observation_geojson(newobs.id_observation) current_app.logger.debug("FEATURES: {}".format(features)) # Enregistrement de la photo et correspondance Obs Photo try: file = save_upload_files( request.files, "obstax", datas2db["cd_nom"], newobs.id_observation, ObservationMediaModel, ) current_app.logger.debug( "[post_observation] ObsTax UPLOAD FILE {}".format(file)) features[0]["properties"]["images"] = file except Exception as e: current_app.logger.warning( "[post_observation] ObsTax ERROR ON FILE SAVING", str(e)) # raise GeonatureApiError(e) return ({ "message": "Nouvelle observation créée.", "features": features }, 200) except Exception as e: current_app.logger.critical("[post_observation] Error: %s", str(e)) return {"message": str(e)}, 400