def getViewReleveOccurrence(info_role): """ Deprecated """ releve_repository = ReleveRepository(VReleveOccurrence) q = releve_repository.get_filtered_query(info_role) parameters = request.args nbResultsWithoutFilter = DB.session.query(VReleveOccurrence).count() limit = int(parameters.get("limit")) if parameters.get("limit") else 100 page = int(parameters.get("offset")) if parameters.get("offset") else 0 # Filters for param in parameters: if param in VReleveOccurrence.__table__.columns: col = getattr(VReleveOccurrence.__table__.columns, param) q = q.filter(col == parameters[param]) # Order by if "orderby" in parameters: if parameters.get("orderby") in VReleveOccurrence.__table__.columns: orderCol = getattr( VReleveOccurrence.__table__.columns, parameters["orderby"] ) if "order" in parameters: if parameters["order"] == "desc": orderCol = orderCol.desc() q = q.order_by(orderCol) try: data = q.limit(limit).offset(page * limit).all() except Exception as e: DB.session.rollback() raise user = info_role user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="OCCTAX", id_application_parent=current_app.config["ID_APPLICATION_GEONATURE"], ) featureCollection = [] for n in data: releve_cruved = n.get_releve_cruved(user, user_cruved) feature = n.get_geofeature() feature["properties"]["rights"] = releve_cruved featureCollection.append(feature) if data: return { "items": FeatureCollection(featureCollection), "total": nbResultsWithoutFilter, } return {"message": "not found"}, 404
def get_zh(info_role): q = DB.session.query(TZH) parameters = request.args limit = int(parameters.get("limit", 100)) page = int(parameters.get("offset", 0)) # Pour obtenir le nombre de résultat de la requete sans le LIMIT nb_results_without_limit = q.count() user = info_role user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="ZONES_HUMIDES") data = q.limit(limit).offset(page * limit).all() featureCollection = [] for n in data: releve_cruved = n.get_releve_cruved(user, user_cruved) feature = n.get_geofeature(relationships=()) feature["properties"]["rights"] = releve_cruved featureCollection.append(feature) return { "total": nb_results_without_limit, "total_filtered": len(data), "page": page, "limit": limit, "items": FeatureCollection(featureCollection), }
def get_all(self, info_role, with_cruved=False, mapping_type=None): """ Get all mappings """ users_mapping = self.get_user_mapping(info_role) q = DB.session.query(TMappings).filter(TMappings.temporary == False) if mapping_type: q = q.filter(TMappings.mapping_type == mapping_type.upper()) if info_role.value_filter in ("1", "2"): q = q.filter(TMappings.id_mapping.in_(users_mapping)) data = q.all() if with_cruved: user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="IMPORT", object_code="MAPPING", ) mapping_as_dict = [] for d in data: temp = d.as_dict() temp["cruved"] = self.get_mapping_cruved( user_cruved, d.id_mapping, users_mapping) mapping_as_dict.append(temp) return mapping_as_dict return [d.as_dict() for d in data]
def occurrenceHandler(request, *, occurrence, info_role): releve = TRelevesOccurrence.query.get_or_404(occurrence.id_releve_occtax) # Test des droits d'édition du relevé si modification if occurrence.id_occurrence_occtax is not None: user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCTAX") # info_role.code_action = update_data_scope info_role = UserRigth( id_role=info_role.id_role, value_filter=user_cruved["U"], code_action="U", id_organisme=info_role.id_organisme, ) releve = releve.get_releve_if_allowed(info_role) # fin test, si ici => c'est ok occurrenceSchema = OccurrenceSchema() try: occurrence = occurrenceSchema.load(request.get_json(), instance=occurrence) except ValidationError as error: log.exception(error.messages) raise BadRequest(error.messages) DB.session.add(occurrence) DB.session.commit() return occurrence
def getOneReleve(id_releve, info_role): """ Get one releve .. :quickref: Occtax; :param id_releve: the id releve from pr_occtax.t_releve_occtax :type id_releve: int :returns: Return a releve with its attached Cruved :rtype: `dict{'releve':<TRelevesOccurrence>, 'cruved': Cruved}` """ releveCruvedSchema = ReleveCruvedSchema() releve = DB.session.query(TRelevesOccurrence).get(id_releve) if not releve: raise NotFound('The releve "{}" does not exist'.format(id_releve)) # check if the user is autorized releve = releve.get_releve_if_allowed(info_role) user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="OCCTAX" ) releve_cruved = { "releve": { "properties": releve, "id": releve.id_releve_occtax, "geometry": releve.geom_4326, }, "cruved": releve.get_releve_cruved(info_role, user_cruved), } return releveCruvedSchema.dump(releve_cruved)
def returnUserCruved(info_role): # récupérer le CRUVED complet de l'utilisateur courant user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code=blueprint.config['MODULE_CODE']) return user_cruved
def getReleves(info_role): """ Route for map list web interface .. :quickref: Occtax; """ releve_repository = ReleveRepository(TRelevesOccurrence) q = releve_repository.get_filtered_query(info_role) parameters = request.args limit = int(parameters.get("limit", 100)) page = int(parameters.get("offset", 0)) orderby = { "orderby": (parameters.get("orderby", "date_max")).lower(), "order": (parameters.get("order", "desc")).lower() if (parameters.get( "order", "desc")).lower() == "asc" else "desc", # asc or desc } # Filters q = get_query_occtax_filters(parameters, TRelevesOccurrence, q) query_without_limit = q # Order by q = get_query_occtax_order(orderby, TRelevesOccurrence, q) data = q.limit(limit).offset(page * limit).all() # Pour obtenir le nombre de résultat de la requete sans le LIMIT nb_results_without_limit = query_without_limit.count() user = info_role user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCTAX") featureCollection = [] for n in data: releve_cruved = n.get_releve_cruved(user, user_cruved) feature = n.get_geofeature(relationships=( "t_occurrences_occtax", "cor_counting_occtax", "taxref", "observers", "digitiser", "dataset", "right", "medias", )) feature["properties"]["rights"] = releve_cruved featureCollection.append(feature) return { "total": nb_results_without_limit, "total_filtered": len(data), "page": page, "limit": limit, "items": FeatureCollection(featureCollection), }
def post_station(info_role): """ Post one occhab station (station + habitats) .. :quickref: OccHab; Post one occhab station (station + habitats) :returns: GeoJson<TStationsOcchab> """ data = dict(request.get_json()) occ_hab = None properties = data['properties'] if "t_habitats" in properties: occ_hab = properties.pop("t_habitats") observers_list = None if "observers" in properties: observers_list = properties.pop("observers") station = TStationsOcchab(**properties) shape = asShape(data["geometry"]) two_dimension_geom = remove_third_dimension(shape) station.geom_4326 = from_shape(two_dimension_geom, srid=4326) if observers_list is not None: observers = ( DB.session.query(User).filter( User.id_role.in_( list(map(lambda user: user['id_role'], observers_list)) )).all() ) for o in observers: station.observers.append(o) t_hab_list_object = [] if occ_hab is not None: for occ in occ_hab: if occ['id_habitat'] is None: occ.pop('id_habitat') data_attr = [k for k in occ] for att in data_attr: if not getattr(THabitatsOcchab, att, False): occ.pop(att) t_hab_list_object.append(THabitatsOcchab(**occ)) # set habitat complexe station.is_habitat_complex = len(t_hab_list_object) > 1 station.t_habitats = t_hab_list_object if station.id_station: user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="OCCHAB" ) # check if allowed to update or raise 403 station.check_if_allowed(info_role, 'U', user_cruved["U"]) DB.session.merge(station) else: DB.session.add(station) DB.session.commit() return station.get_geofeature()
def getViewReleveOccurrence(info_role): releve_repository = ReleveRepository(VReleveOccurrence) q = releve_repository.get_filtered_query(info_role) parameters = request.args nbResultsWithoutFilter = DB.session.query(VReleveOccurrence).count() limit = int(parameters.get("limit")) if parameters.get("limit") else 100 page = int(parameters.get("offset")) if parameters.get("offset") else 0 # Filters for param in parameters: if param in VReleveOccurrence.__table__.columns: col = getattr(VReleveOccurrence.__table__.columns, param) q = q.filter(col == parameters[param]) # Order by if "orderby" in parameters: if parameters.get("orderby") in VReleveOccurrence.__table__.columns: orderCol = getattr( VReleveOccurrence.__table__.columns, parameters["orderby"] ) if "order" in parameters: if parameters["order"] == "desc": orderCol = orderCol.desc() q = q.order_by(orderCol) try: data = q.limit(limit).offset(page * limit).all() except Exception as e: DB.session.rollback() raise user = info_role user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="OCCTAX", id_application_parent=current_app.config["ID_APPLICATION_GEONATURE"], ) featureCollection = [] for n in data: releve_cruved = n.get_releve_cruved(user, user_cruved) feature = n.get_geofeature() feature["properties"]["rights"] = releve_cruved featureCollection.append(feature) if data: return { "items": FeatureCollection(featureCollection), "total": nbResultsWithoutFilter, } return {"message": "not found"}, 404
def getReleves(info_role): releve_repository = ReleveRepository(TRelevesOccurrence) q = releve_repository.get_filtered_query(info_role) parameters = request.args limit = int(parameters.get("limit", 100)) page = int(parameters.get("offset", 0)) orderby = { "orderby": (parameters.get("orderby", "date_max")).lower(), "order": (parameters.get("order", "desc")).lower() if (parameters.get("order", "desc")).lower() == "asc" else "desc", # asc or desc } # Filters q = get_query_occtax_filters(parameters, TRelevesOccurrence, q) # Order by q = get_query_occtax_order(orderby, TRelevesOccurrence, q) try: data = q.limit(limit).offset(page * limit).all() except Exception as e: DB.session.rollback() raise # Pour obtenir le nombre de résultat de la requete sans le LIMIT try: nbResultsQuery = releve_repository.get_filtered_query(info_role) nbResultsQuery = get_query_occtax_filters( parameters, TRelevesOccurrence, nbResultsQuery ) nbResultsWithoutFilter = nbResultsQuery.count() except Exception as e: DB.session.rollback() raise user = info_role user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="OCCTAX" ) featureCollection = [] for n in data: releve_cruved = n.get_releve_cruved(user, user_cruved) feature = n.get_geofeature() feature["properties"]["rights"] = releve_cruved featureCollection.append(feature) return { "total": nbResultsWithoutFilter, "total_filtered": len(data), "page": page, "limit": limit, "items": FeatureCollection(featureCollection), }
def getOneReleve(id_releve, info_role): """ Get one releve """ releve_repository = ReleveRepository(TRelevesOccurrence) releve_model, releve_geojson = releve_repository.get_one(id_releve, info_role) user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="OCCTAX" ) releve_cruved = releve_model.get_releve_cruved(info_role, user_cruved) return {"releve": releve_geojson, "cruved": releve_cruved}
def getOneReleve(id_releve, info_role): """ Get one releve """ releve_repository = ReleveRepository(TRelevesOccurrence) releve_model, releve_geojson = releve_repository.get_one( id_releve, info_role) user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCTAX") releve_cruved = releve_model.get_releve_cruved(info_role, user_cruved) return {"releve": releve_geojson, "cruved": releve_cruved}
def releveHandler(request, *, releve, info_role): # Test des droits d'édition du relevé if releve.id_releve_occtax is not None: user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCTAX") # info_role.code_action = update_data_scope user = UserRigth( id_role=info_role.id_role, value_filter=user_cruved["U"], code_action="U", id_organisme=info_role.id_organisme, ) releve = releve.get_releve_if_allowed(user) # fin test, si ici => c'est ok # if creation else: if info_role.value_filter in ("0", "1", "2"): # Check if user can add a releve in the current dataset allowed = releve.user_is_in_dataset_actor(info_role) if not allowed: raise InsufficientRightsError( "User {} has no right in dataset {}".format( info_role.id_role, releve.id_dataset), 403, ) # creation du relevé à partir du POST releveSchema = ReleveSchema() # Modification de la requete geojson en releve json_req = request.get_json() json_req["properties"]["geom_4326"] = json_req["geometry"] # chargement des données POST et merge avec relevé initial releve, errors = releveSchema.load(json_req["properties"], instance=releve) if bool(errors): raise InsufficientRightsError( errors, 422, ) # set id_digitiser releve.id_digitiser = info_role.id_role DB.session.add(releve) DB.session.commit() DB.session.flush() return releve
def get_sensitive_view(info_role): # Récupérer l'id de l'utilisateur qui demande la route id_role = info_role.id_role # Récupérer la portée autorisée à l'utilisateur pour l'acton 'R' (read) read_scope = info_role.value_filter #récupérer le CRUVED complet de l'utilisateur courant user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code='MY_MODULE_CODE', ) q = DB.session.query(MySQLAModel) data = q.all() return [d.as_dict() for d in data]
def get_sensitive_view(info_role): # Récupérer l'id de l'utilisateur qui demande la route id_role = info_role.id_role # Récupérer la portée autorisée à l'utilisateur pour l'acton 'R' (read) read_scope = info_role.value_filter #récupérer le CRUVED complet de l'utilisateur courant user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code='BIOMAP', ) q = DB.session.query(MySQLAModel) data = q.all() return [d.as_dict() for d in data]
def get_one(self, id_mapping, info_role, with_cruved): users_mapping = self.get_user_mapping(info_role) mapping = DB.session.query(TMappings).get(id_mapping) if mapping: mapping_as_dict = mapping.as_dict() if with_cruved: user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="IMPORT", object_code="MAPPING", ) mapping_as_dict["cruved"] = self.get_mapping_cruved( user_cruved, id_mapping, users_mapping) return mapping_as_dict return None
def envoiPost(data): DB.session.rollback() # if its not an update we check if there is not aleady a visit this year print('LAAAAAA') #print(data) if not data['id_base_visit']: check_year_visit(data['id_base_site'], data['visit_date_min'][0:4]) try: tab_perturbation = data.pop('cor_visit_perturbation') except: pass tab_visit_grid = data.pop('cor_visit_grid') tab_observer = data.pop('cor_visit_observer') visit = TVisiteSFT(**data) visit.as_dict(True) # pour que visit prenne en compte des relations # sinon elle prend pas en compte le fait qu'on efface toutes les perturbations quand on édite par ex. try: perturs = DB.session.query(TNomenclatures).filter( TNomenclatures.id_nomenclature.in_(tab_perturbation)).all() for per in perturs: visit.cor_visit_perturbation.append(per) except: pass for v in tab_visit_grid: visit_grid = CorVisitGrid(**v) visit.cor_visit_grid.append(visit_grid) observers = DB.session.query(User).filter( User.id_role.in_(tab_observer)).all() for o in observers: visit.observers.append(o) if visit.id_base_visit: user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code='SFT') update_cruved = user_cruved['U'] check_user_cruved_visit(info_role, visit, update_cruved) DB.session.merge(visit) else: DB.session.add(visit) DB.session.commit() return visit.as_dict(recursif=True)
def getOneReleve(id_releve, info_role): """ Get one releve .. :quickref: Occtax; :param id_releve: the id releve from pr_occtax.t_releve_occtax :type id_releve: int :returns: Return a releve with its attached Cruved :rtype: `dict{'releve':<TRelevesOccurrence>, 'cruved': Cruved}` """ releve_repository = ReleveRepository(TRelevesOccurrence) releve_model, releve_geojson = releve_repository.get_one( id_releve, info_role) user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCTAX") releve_cruved = releve_model.get_releve_cruved(info_role, user_cruved) return {"releve": releve_geojson, "cruved": releve_cruved}
def get_all_habitats(info_role): """ Get all stations with their hab .. :quickref: Occhab; """ params = request.args.to_dict() q = DB.session.query(TStationsOcchab) if 'id_dataset' in params: q = q.filter(TStationsOcchab.id_dataset == params['id_dataset']) if 'cd_hab' in params: q = q.filter(TStationsOcchab.t_habitats.any(cd_hab=params['cd_hab'])) if 'date_low' in params: q = q.filter(TStationsOcchab.date_min >= params.pop("date_low")) if "date_up" in params: q = q.filter(TStationsOcchab.date_max <= params.pop("date_up")) q = filter_query_with_cruved( TStationsOcchab, q, info_role ) q = q.order_by(TStationsOcchab.date_min.desc()) limit = request.args.get( 'limit', None) or blueprint.config['NB_MAX_MAP_LIST'] data = q.limit(limit) user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="OCCHAB" ) feature_list = [] for d in data: feature = d.get_geofeature(True) feature['properties']['rights'] = d.get_releve_cruved( info_role, user_cruved) feature_list.append(feature) return FeatureCollection(feature_list)
def occurrenceHandler(request, *, occurrence, info_role): try: releve = DB.session.query(TRelevesOccurrence).get( occurrence.id_releve_occtax) except Exception as e: DB.session.rollback() raise if not releve: raise InsufficientRightsError( {"message": "not found"}, 404, ) # Test des droits d'édition du relevé si modification if occurrence.id_occurrence_occtax is not None: user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCTAX") # info_role.code_action = update_data_scope info_role = UserRigth( id_role=info_role.id_role, value_filter=user_cruved["U"], code_action="U", id_organisme=info_role.id_organisme, ) releve = releve.get_releve_if_allowed(info_role) # fin test, si ici => c'est ok occurrenceSchema = OccurrenceSchema() occurrence, errors = occurrenceSchema.load(request.get_json(), instance=occurrence) if bool(errors): return errors, 422 DB.session.add(occurrence) DB.session.commit() return occurrence
def get_one_station(id_station, info_role): """ Return one station .. :quickref: Occhab; :param id_station: the id_station :type id_station: int :return: a dict representing one station with its habitats :rtype dict<TStationsOcchab> """ station = DB.session.query(OneStation).get(id_station) station_geojson = station.get_geofeature(True) user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCHAB") station_geojson["properties"]["rights"] = station.get_releve_cruved( info_role, user_cruved) return station_geojson
def insertOrUpdateOneReleve(info_role): releveRepository = ReleveRepository(TRelevesOccurrence) data = dict(request.get_json()) occurrences_occtax = None if "t_occurrences_occtax" in data["properties"]: occurrences_occtax = data["properties"]["t_occurrences_occtax"] data["properties"].pop("t_occurrences_occtax") observersList = None if "observers" in data["properties"]: observersList = data["properties"]["observers"] data["properties"].pop("observers") # Test et suppression des propriétés inexistantes de TRelevesOccurrence attliste = [k for k in data["properties"]] for att in attliste: if not getattr(TRelevesOccurrence, att, False): data["properties"].pop(att) releve = TRelevesOccurrence(**data["properties"]) shape = asShape(data["geometry"]) releve.geom_4326 = from_shape(shape, srid=4326) if observersList is not None: observers = DB.session.query(User).filter( User.id_role.in_(observersList)).all() for o in observers: releve.observers.append(o) for occ in occurrences_occtax: cor_counting_occtax = [] if "cor_counting_occtax" in occ: cor_counting_occtax = occ["cor_counting_occtax"] occ.pop("cor_counting_occtax") # Test et suppression # des propriétés inexistantes de TOccurrencesOccurrence attliste = [k for k in occ] for att in attliste: if not getattr(TOccurrencesOccurrence, att, False): occ.pop(att) # pop the id if None. otherwise DB.merge is not OK if "id_occurrence_occtax" in occ and occ[ "id_occurrence_occtax"] is None: occ.pop("id_occurrence_occtax") occtax = TOccurrencesOccurrence(**occ) for cnt in cor_counting_occtax: # Test et suppression # des propriétés inexistantes de CorCountingOccurrence attliste = [k for k in cnt] for att in attliste: if not getattr(CorCountingOccurrence, att, False): cnt.pop(att) # pop the id if None. otherwise DB.merge is not OK if "id_counting_occtax" in cnt and cnt[ "id_counting_occtax"] is None: cnt.pop("id_counting_occtax") countingOccurrence = CorCountingOccurrence(**cnt) occtax.cor_counting_occtax.append(countingOccurrence) releve.t_occurrences_occtax.append(occtax) # if its a update if releve.id_releve_occtax: # get update right of the user user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCTAX") update_code_filter = user_cruved["U"] # info_role.code_action = update_data_scope user = UserRigth( id_role=info_role.id_role, value_filter=update_code_filter, code_action="U", id_organisme=info_role.id_organisme, ) releve = releveRepository.update(releve, user, shape) # if its a simple post else: # set id_digitiser releve.id_digitiser = info_role.id_role if info_role.value_filter in ("0", "1", "2"): # Check if user can add a releve in the current dataset allowed = releve.user_is_in_dataset_actor(info_role) if not allowed: raise InsufficientRightsError( "User {} has no right in dataset {}".format( info_role.id_role, releve.id_dataset), 403, ) DB.session.add(releve) DB.session.commit() DB.session.flush() return releve.get_geofeature()
def getViewReleveList(info_role): """ Retour la liste résumé des relevés avec occurrences Parameters ---------- limit: int Nombre max de résulats à retourner offset: int Numéro de la page à retourner cd_nom: int Filtrer les relevés avec des occurrences avec le taxon x observers: int date_up: date Date minimum des relevés à retourner date_low: date Date maximum des relevés à retourner date_eq: date Date exacte des relevés à retourner orderby: char Nom du champ sur lequel baser l'ordonnancement order: char (asc|desc) Sens de l'ordonnancement organism: int id de l'organisme [NomChampTableVReleveList] Filtre sur le champ NomChampTableVReleveList Returns ------- json { 'total': Nombre total de résultat, 'total_filtered': Nombre total de résultat après filtration , 'page': Numéro de la page retournée, 'limit': Nombre de résultats, 'items': données au format GeoJson } """ releveRepository = ReleveRepository(VReleveList) q = releveRepository.get_filtered_query(info_role) params = request.args.to_dict() nbResultsWithoutFilter = VReleveList.query.count() limit = int(params.get("limit")) if params.get("limit") else 100 page = int(params.get("offset")) if params.get("offset") else 0 q = get_query_occtax_filters(request.args, VReleveList, q) # order by date q = q.order_by(VReleveList.date_min.desc()) nbResults = q.count() data = q.limit(limit).offset(page * limit).all() user = info_role user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCTAX") featureCollection = [] for n in data: releve_cruved = n.get_releve_cruved(user, user_cruved) feature = n.get_geofeature() feature["properties"]["rights"] = releve_cruved featureCollection.append(feature) return { "total": nbResultsWithoutFilter, "total_filtered": nbResults, "page": page, "limit": limit, "items": FeatureCollection(featureCollection), }
def getViewReleveList(info_role): """ Retour la liste résumé des relevés avec occurrences Parameters ---------- limit: int Nombre max de résulats à retourner offset: int Numéro de la page à retourner cd_nom: int Filtrer les relevés avec des occurrences avec le taxon x observers: int date_up: date Date minimum des relevés à retourner date_low: date Date maximum des relevés à retourner date_eq: date Date exacte des relevés à retourner orderby: char Nom du champ sur lequel baser l'ordonnancement order: char (asc|desc) Sens de l'ordonnancement organism: int id de l'organisme [NomChampTableVReleveList] Filtre sur le champ NomChampTableVReleveList Returns ------- json { 'total': Nombre total de résultat, 'total_filtered': Nombre total de résultat après filtration , 'page': Numéro de la page retournée, 'limit': Nombre de résultats, 'items': données au format GeoJson } """ releveRepository = ReleveRepository(VReleveList) q = releveRepository.get_filtered_query(info_role) params = request.args.to_dict() nbResultsWithoutFilter = VReleveList.query.count() limit = int(params.get("limit")) if params.get("limit") else 100 page = int(params.get("offset")) if params.get("offset") else 0 q = get_query_occtax_filters(request.args, VReleveList, q) # order by date q = q.order_by(VReleveList.date_min.desc()) nbResults = q.count() data = q.limit(limit).offset(page * limit).all() user = info_role user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="OCCTAX" ) featureCollection = [] for n in data: releve_cruved = n.get_releve_cruved(user, user_cruved) feature = n.get_geofeature() feature["properties"]["rights"] = releve_cruved featureCollection.append(feature) return { "total": nbResultsWithoutFilter, "total_filtered": nbResults, "page": page, "limit": limit, "items": FeatureCollection(featureCollection), }
def insertOrUpdateOneReleve(info_role): releveRepository = ReleveRepository(TRelevesOccurrence) data = dict(request.get_json()) occurrences_occtax = None if "t_occurrences_occtax" in data["properties"]: occurrences_occtax = data["properties"]["t_occurrences_occtax"] data["properties"].pop("t_occurrences_occtax") observersList = None if "observers" in data["properties"]: observersList = data["properties"]["observers"] data["properties"].pop("observers") # Test et suppression des propriétés inexistantes de TRelevesOccurrence attliste = [k for k in data["properties"]] for att in attliste: if not getattr(TRelevesOccurrence, att, False): data["properties"].pop(att) releve = TRelevesOccurrence(**data["properties"]) shape = asShape(data["geometry"]) releve.geom_4326 = from_shape(shape, srid=4326) if observersList is not None: observers = DB.session.query(User).filter(User.id_role.in_(observersList)).all() for o in observers: releve.observers.append(o) for occ in occurrences_occtax: cor_counting_occtax = [] if "cor_counting_occtax" in occ: cor_counting_occtax = occ["cor_counting_occtax"] occ.pop("cor_counting_occtax") # Test et suppression # des propriétés inexistantes de TOccurrencesOccurrence attliste = [k for k in occ] for att in attliste: if not getattr(TOccurrencesOccurrence, att, False): occ.pop(att) # pop the id if None. otherwise DB.merge is not OK if "id_occurrence_occtax" in occ and occ["id_occurrence_occtax"] is None: occ.pop("id_occurrence_occtax") occtax = TOccurrencesOccurrence(**occ) for cnt in cor_counting_occtax: # Test et suppression # des propriétés inexistantes de CorCountingOccurrence attliste = [k for k in cnt] for att in attliste: if not getattr(CorCountingOccurrence, att, False): cnt.pop(att) # pop the id if None. otherwise DB.merge is not OK if "id_counting_occtax" in cnt and cnt["id_counting_occtax"] is None: cnt.pop("id_counting_occtax") countingOccurrence = CorCountingOccurrence(**cnt) occtax.cor_counting_occtax.append(countingOccurrence) releve.t_occurrences_occtax.append(occtax) # if its a update if releve.id_releve_occtax: # get update right of the user user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="OCCTAX" ) update_code_filter = user_cruved["U"] # info_role.code_action = update_data_scope user = UserRigth( id_role=info_role.id_role, value_filter=update_code_filter, code_action="U", id_organisme=info_role.id_organisme, ) releve = releveRepository.update(releve, user, shape) # if its a simple post else: # set id_digitiser releve.id_digitiser = info_role.id_role if info_role.value_filter in ("0", "1", "2"): # Check if user can add a releve in the current dataset allowed = releve.user_is_in_dataset_actor(info_role) if not allowed: raise InsufficientRightsError( "User {} has no right in dataset {}".format( info_role.id_role, releve.id_dataset ), 403, ) DB.session.add(releve) DB.session.commit() DB.session.flush() return releve.get_geofeature()
def export(info_role): """Export data from pr_occtax.export_occtax_sinp view (parameter) .. :quickref: Occtax; Export data from pr_occtax.export_occtax_sinp :query str format: format of the export ('csv', 'geojson', 'shapefile', 'medias') """ export_view_name = blueprint.config["export_view_name"] export_geom_column = blueprint.config["export_geom_columns_name"] export_columns = blueprint.config["export_columns"] export_srid = blueprint.config["export_srid"] export_view = GenericTableGeo( tableName=export_view_name, schemaName="pr_occtax", engine=DB.engine, geometry_field=export_geom_column, srid=export_srid, ) releve_repository = ReleveRepository(export_view) q = releve_repository.get_filtered_query(info_role, from_generic_table=True) q = get_query_occtax_filters( request.args, export_view, q, from_generic_table=True, obs_txt_column=blueprint.config["export_observer_txt_column"], ) data = q.all() file_name = datetime.datetime.now().strftime("%Y_%m_%d_%Hh%Mm%S") file_name = filemanager.removeDisallowedFilenameChars(file_name) export_format = request.args[ "format"] if "format" in request.args else "geojson" if export_format == "csv": columns = (export_columns if len(export_columns) > 0 else [db_col.key for db_col in export_view.db_cols]) return to_csv_resp(file_name, [export_view.as_dict(d) for d in data], columns, ";") elif export_format == "geojson": results = FeatureCollection([ export_view.as_geofeature(d, columns=export_columns) for d in data ]) return to_json_resp(results, as_file=True, filename=file_name, indent=4, extension="geojson") #MET 21/10/2020 Ajout d'un export medias elif export_format == "medias": try: releve_repository_for_media = ReleveRepository(TRelevesOccurrence) q = releve_repository_for_media.get_filtered_query(info_role) parameters = request.args # Filters q = get_query_occtax_filters(parameters, TRelevesOccurrence, q) data = q.all() user = info_role user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCTAX") #on crée le dossier s'il n'existe pas dir_path = str(ROOT_DIR / "backend/static/medias/exports") if not os.path.exists(dir_path): os.makedirs(dir_path) #on le clean filemanager.delete_recursively(dir_path) featureCollection = [] zip_path = dir_path + "/" + file_name + ".zip" zp_file = zipfile.ZipFile(zip_path, mode="w") for n in data: releve_cruved = n.get_releve_cruved(user, user_cruved) feature = n.get_geofeature( relationships=('t_occurrences_occtax', 'cor_counting_occtax', 'medias')) if 'properties' in feature: if 't_occurrences_occtax' in feature['properties']: for occurence in feature['properties'][ 't_occurrences_occtax']: for counting in occurence['cor_counting_occtax']: if 'medias' in counting: for media in counting['medias']: if media['media_path'] is not None: file_path = str( ROOT_DIR / "backend/" ) + "/" + media['media_path'] if os.path.exists(file_path): zp_file.write( file_path, os.path.basename( file_path)) #copyfile( file_path, dir_path + "/" + os.path.basename(file_path)) #featureCollection.append(file_path) zp_file.close() return send_from_directory(dir_path, file_name + ".zip", as_attachment=True) except GeonatureApiError as e: message = str(e) else: try: filemanager.delete_recursively(str(ROOT_DIR / "backend/static/shapefiles"), excluded_files=[".gitkeep"]) db_cols = [ db_col for db_col in export_view.db_cols if db_col.key in export_columns ] dir_path = str(ROOT_DIR / "backend/static/shapefiles") export_view.as_shape(db_cols=db_cols, data=data, dir_path=dir_path, file_name=file_name) return send_from_directory(dir_path, file_name + ".zip", as_attachment=True) except GeonatureApiError as e: message = str(e) return render_template( "error.html", error=message, redirect=current_app.config["URL_APPLICATION"] + "/#/occtax", )
def insertOrUpdateOneReleve(info_role): """ Route utilisée depuis l'appli mobile => depreciée et non utilisée par l'appli web Post one Occtax data (Releve + Occurrence + Counting) .. :quickref: Occtax; Post one Occtax data (Releve + Occurrence + Counting) **Request JSON object:** .. sourcecode:: http { "geometry": {"type":"Point", "coordinates":[0.9008789062500001,47.14489748555398]}, "properties": { "id_releve_occtax":null,"id_dataset":1,"id_digitiser":1,"date_min":"2019-05-09","date_max":"2019-05-09","hour_min":null,"hour_max":null,"altitude_min":null,"altitude_max":null,"meta_device_entry":"web","comment":null,"id_nomenclature_obs_technique":316,"observers":[1],"observers_txt":null,"id_nomenclature_grp_typ":132, "t_occurrences_occtax":[{ "id_releve_occtax":null,"id_occurrence_occtax":null,"id_nomenclature_obs_technique":41,"id_nomenclature_bio_condition":157,"id_nomenclature_bio_status":29,"id_nomenclature_naturalness":160,"id_nomenclature_exist_proof":81,"id_nomenclature_observation_status":88,"id_nomenclature_blurring":175,"id_nomenclature_source_status":75,"determiner":null,"id_nomenclature_determination_method":445,"cd_nom":67111,"nom_cite":"Ablette = <i> Alburnus alburnus (Linnaeus, 1758)</i> - [ES - 67111]","meta_v_taxref":null,"sample_number_proof":null,"comment":null, "cor_counting_occtax":[{ "id_counting_occtax":null,"id_nomenclature_life_stage":1,"id_nomenclature_sex":171,"id_nomenclature_obj_count":146,"id_nomenclature_type_count":94,"id_occurrence_occtax":null,"count_min":1,"count_max":1 }] }] } } :returns: GeoJson<TRelevesOccurrence> """ releveRepository = ReleveRepository(TRelevesOccurrence) data = dict(request.get_json()) occurrences_occtax = None if "t_occurrences_occtax" in data["properties"]: occurrences_occtax = data["properties"]["t_occurrences_occtax"] data["properties"].pop("t_occurrences_occtax") observersList = None if "observers" in data["properties"]: observersList = data["properties"]["observers"] data["properties"].pop("observers") # Test et suppression des propriétés inexistantes de TRelevesOccurrence attliste = [k for k in data["properties"]] for att in attliste: if not getattr(TRelevesOccurrence, att, False): data["properties"].pop(att) releve = TRelevesOccurrence(**data["properties"]) shape = asShape(data["geometry"]) two_dimension_geom = remove_third_dimension(shape) releve.geom_4326 = from_shape(two_dimension_geom, srid=4326) if observersList is not None: observers = DB.session.query(User).filter(User.id_role.in_(observersList)).all() for o in observers: releve.observers.append(o) for occ in occurrences_occtax: cor_counting_occtax = [] if "cor_counting_occtax" in occ: cor_counting_occtax = occ["cor_counting_occtax"] occ.pop("cor_counting_occtax") # Test et suppression # des propriétés inexistantes de TOccurrencesOccurrence attliste = [k for k in occ] for att in attliste: if not getattr(TOccurrencesOccurrence, att, False): occ.pop(att) # pop the id if None. otherwise DB.merge is not OK if "id_occurrence_occtax" in occ and occ["id_occurrence_occtax"] is None: occ.pop("id_occurrence_occtax") occtax = TOccurrencesOccurrence(**occ) for cnt in cor_counting_occtax: # Test et suppression # des propriétés inexistantes de CorCountingOccurrence attliste = [k for k in cnt] for att in attliste: if not getattr(CorCountingOccurrence, att, False): cnt.pop(att) # pop the id if None. otherwise DB.merge is not OK if "id_counting_occtax" in cnt and cnt["id_counting_occtax"] is None: cnt.pop("id_counting_occtax") countingOccurrence = CorCountingOccurrence(**cnt) occtax.cor_counting_occtax.append(countingOccurrence) releve.t_occurrences_occtax.append(occtax) # if its a update if releve.id_releve_occtax: # get update right of the user user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code="OCCTAX" ) update_code_filter = user_cruved["U"] # info_role.code_action = update_data_scope user = UserRigth( id_role=info_role.id_role, value_filter=update_code_filter, code_action="U", id_organisme=info_role.id_organisme, ) releve = releveRepository.update(releve, user, shape) # if its a simple post else: # set id_digitiser releve.id_digitiser = info_role.id_role if info_role.value_filter in ("0", "1", "2"): # Check if user can add a releve in the current dataset allowed = releve.user_is_in_dataset_actor(info_role) if not allowed: raise InsufficientRightsError( "User {} has no right in dataset {}".format( info_role.id_role, releve.id_dataset ), 403, ) DB.session.add(releve) DB.session.commit() DB.session.flush() return releve.get_geofeature()
def test(info_role): """ Deprecated """ file_name = datetime.datetime.now().strftime("%Y_%m_%d_%Hh%Mm%S") file_name = filemanager.removeDisallowedFilenameChars(file_name) releve_repository = ReleveRepository(TRelevesOccurrence) q = releve_repository.get_filtered_query(info_role) parameters = request.args # Filters q = get_query_occtax_filters(parameters, TRelevesOccurrence, q) data = q.all() user = info_role user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCTAX") #on crée le dossier s'il n'existe pas dir_path = str(ROOT_DIR / "backend/static/medias/exports") if not os.path.exists(dir_path): os.makedirs(dir_path) #on le clean filemanager.delete_recursively( str(ROOT_DIR / "backend/static/medias/exports")) featureCollection = [] zip_path = dir_path + "/" + file_name + ".zip" zp_file = zipfile.ZipFile(zip_path, mode="w") for n in data: releve_cruved = n.get_releve_cruved(user, user_cruved) feature = n.get_geofeature(relationships=('t_occurrences_occtax', 'cor_counting_occtax', 'medias')) if 'properties' in feature: if 't_occurrences_occtax' in feature['properties']: for occurence in feature['properties']['t_occurrences_occtax']: for counting in occurence['cor_counting_occtax']: if 'medias' in counting: for media in counting['medias']: if media['media_path'] is not None: file_path = str( ROOT_DIR / "backend/") + "/" + media['media_path'] if os.path.exists(file_path): zp_file.write( file_path, os.path.basename(file_path)) #copyfile( file_path, dir_path + "/" + os.path.basename(file_path)) #featureCollection.append(file_path) #return {"items": media,} # if feature['properties']['t_occurrences_occtax']: # for occurence in feature['properties']['t_occurrences_occtax'] : # featureCollection.append(occurence) #featureCollection.append(feature) zp_file.close() return send_from_directory(dir_path, file_name + ".zip", as_attachment=True)
def patch_visit(idv, info_role): ''' Mettre à jour une visite Si une donnée n'est pas présente dans les objets observer, cor_visit_taxons ou cor_visit_perurbations, elle sera supprimée de la base de données ''' data = dict(request.get_json()) try: existingVisit = TVisitSHT.query.filter_by(id_base_visit = idv).first() if(existingVisit == None): raise ValueError('This visit does not exist') except ValueError: resp = jsonify({"error": 'This visit does not exist'}) resp.status_code = 404 return resp existingVisit = existingVisit.as_dict(recursif=True) dateIsUp = data['visit_date_min'] != existingVisit['visit_date_min'] if dateIsUp: check_year_visit(data['id_base_site'], data['visit_date_min'][0:4]) tab_visit_taxons = [] tab_observer = [] tab_perturbation = [] if 'cor_visit_taxons' in data: tab_visit_taxons = data.pop('cor_visit_taxons') if 'cor_visit_observer' in data: tab_observer = data.pop('cor_visit_observer') if 'cor_visit_perturbation' in data: tab_perturbation = data.pop('cor_visit_perturbation') visit = TVisitSHT(**data) DB.session.query(CorVisitPerturbation).filter_by(id_base_visit = idv).delete() for per in tab_perturbation: visitPer = CorVisitPerturbation(**per) visit.cor_visit_perturbation.append(visitPer) DB.session.query(CorVisitTaxon).filter_by(id_base_visit = idv).delete() for taxon in tab_visit_taxons: visitTaxons = CorVisitTaxon(**taxon) visit.cor_visit_taxons.append(visitTaxons) visit.observers = [] observers = DB.session.query(User).filter( User.id_role.in_(tab_observer) ).all() for o in observers: visit.observers.append(o) user_cruved = get_or_fetch_user_cruved( session=session, id_role=info_role.id_role, module_code=blueprint.config['MODULE_CODE'] ) update_cruved = user_cruved['U'] check_user_cruved_visit(info_role, visit, update_cruved) mergeVisit = DB.session.merge(visit) DB.session.commit() return mergeVisit.as_dict(recursif=True)
def getViewReleveList(info_role): """ Return the list of releves with all occurrences and counting .. :quickref: Occtax; Get releves used for frontend map-list :query int limit: Number max of results :query int offset: Page number to return :query int cd_nom: Filter with a taxon cd_nom (multiple) :query int observers: Filter with a id_role (multiple) :query date_up: Date min of a releve :query date_low: Date max of a releve :query date date_eq: Exact date of a releve :query str ordreby: Name of the field to execute order :query order (asc|desc): Way of the order :query int organism: Id of the organism (multiple) :query any name_of_columns: filter on any columns of the table Filtre sur le champ NomChampTableVReleveList **Returns:** .. sourcecode:: http { 'total': Number total of results, 'total_filtered': Number of results after filteer , 'page': Page number, 'limit': Limit, 'items': data on GeoJson format } """ releveRepository = ReleveRepository(VReleveList) q = releveRepository.get_filtered_query(info_role) params = request.args.to_dict() nbResultsWithoutFilter = VReleveList.query.count() limit = int(params.get("limit")) if params.get("limit") else 100 page = int(params.get("offset")) if params.get("offset") else 0 q = get_query_occtax_filters(request.args, VReleveList, q) # order by date q = q.order_by(VReleveList.date_min.desc()) nbResults = q.count() data = q.limit(limit).offset(page * limit).all() user = info_role user_cruved = get_or_fetch_user_cruved(session=session, id_role=info_role.id_role, module_code="OCCTAX") featureCollection = [] for n in data: releve_cruved = n.get_releve_cruved(user, user_cruved) feature = n.get_geofeature() feature["properties"]["rights"] = releve_cruved featureCollection.append(feature) return { "total": nbResultsWithoutFilter, "total_filtered": nbResults, "page": page, "limit": limit, "items": FeatureCollection(featureCollection), }