Code source de geonature.core.gn_meta.repositories

import logging

from sqlalchemy import or_, String, Date, and_, func, select
from sqlalchemy.inspection import inspect
from sqlalchemy.orm import joinedload, contains_eager, aliased
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.sql.functions import func
from sqlalchemy.sql.expression import cast

from flask import request, current_app
import requests

from utils_flask_sqla.serializers import serializable
from utils_flask_sqla.generic import test_type_and_generate_query, testDataType

from geonature.utils.env import DB
from geonature.core.gn_meta.models import (
    TDatasets,
    CorDatasetActor,
    TAcquisitionFramework,
    CorAcquisitionFrameworkActor,
)
from werkzeug.exceptions import Unauthorized

[docs] log = logging.getLogger()
[docs] def cruved_ds_filter(model, role, scope): # TODO check if not used elsewhere (not found in major module of Geonature) if scope not in (1, 2, 3): raise Unauthorized("Not a valid cruved value") elif scope == 3: return True elif scope in (1, 2): sub_q = ( select(func.count("*")) .select_from(TDatasets) .join(CorDatasetActor, TDatasets.id_dataset == CorDatasetActor.id_dataset) ) or_filter = [ TDatasets.id_digitizer == role.id_role, CorDatasetActor.id_role == role.id_role, ] # if organism is None => do not filter on id_organism even if level = 2 if scope == 2 and role.id_organisme is not None: or_filter.append(CorDatasetActor.id_organism == role.id_organisme) sub_q = sub_q.where(and_(or_(*or_filter), model.id_dataset == TDatasets.id_dataset)) return DB.session.execute(sub_q).scalar_one() > 0
[docs] def cruved_af_filter(model, role, scope): if scope not in (1, 2, 3): raise Unauthorized("Not a valid cruved value") elif scope == 3: return True elif scope in (1, 2): sub_q = ( select(func.count("*")) .select_from(TAcquisitionFramework) .join( CorAcquisitionFrameworkActor, TAcquisitionFramework.id_acquisition_framework == CorAcquisitionFrameworkActor.id_acquisition_framework, ) ) or_filter = [ TAcquisitionFramework.id_digitizer == role.id_role, CorAcquisitionFrameworkActor.id_role == role.id_role, ] # if organism is None => do not filter on id_organism even if level = 2 if scope == 2 and role.id_organisme is not None: or_filter.append(CorAcquisitionFrameworkActor.id_organism == role.id_organisme) sub_q = sub_q.where( and_( or_(*or_filter), model.id_acquisition_framework == TAcquisitionFramework.id_acquisition_framework, ) ) return DB.session.execute(sub_q).scalar_one() > 0