示例#1
0
    def filter_other_filters(self):
        """
            Other filters
        """
        if "id_dataset" in self.filters:
            self.query = self.query.where(
                self.model.id_dataset.in_(self.filters.pop("id_dataset"))
            )
        if "observers" in self.filters:
            self.query = self.query.where(
                self.model.observers.ilike("%" + self.filters.pop("observers")[0] + "%")
            )

        if "id_organism" in self.filters:
            datasets = (
                DB.session.query(CorDatasetActor.id_dataset)
                .filter(
                    CorDatasetActor.id_organism.in_(self.filters.pop("id_organism"))
                )
                .all()
            )
            formated_datasets = [d[0] for d in datasets]
            self.query = self.query.where(self.model.id_dataset.in_(formated_datasets))

        if "date_min" in self.filters:
            self.query = self.query.where(
                self.model.date_min >= self.filters.pop("date_min")[0]
            )

        if "date_max" in self.filters:
            self.query = self.query.where(
                self.model.date_min <= self.filters.pop("date_max")[0]
            )

        if "id_acquisition_framework" in self.filters:
            self.query = self.query.where(
                self.model.id_acquisition_framework.in_(
                    self.filters.pop("id_acquisition_framework")
                )
            )

        if "geoIntersection" in self.filters:
            # Insersect with the geom send from the map
            ors = []
            for str_wkt in self.filters["geoIntersection"]:
                # if the geom is a circle
                if "radius" in self.filters:
                    radius = self.filters.pop("radius")[0]
                    wkt = loads(str_wkt)
                    wkt = circle_from_point(wkt, float(radius))
                else:
                    wkt = loads(str_wkt)
                geom_wkb = from_shape(wkt, srid=4326)
                ors.append(self.model.the_geom_4326.ST_Intersects(geom_wkb))

            self.query = self.query.where(or_(*ors))
            self.filters.pop("geoIntersection")

        if "period_start" in self.filters and "period_end" in self.filters:
            period_start = self.filters.pop("period_start")[0]
            period_end = self.filters.pop("period_end")[0]
            self.query = self.query.where(
                or_(
                    func.gn_commons.is_in_period(
                        func.date(self.model.date_min),
                        func.to_date(period_start, "DD-MM"),
                        func.to_date(period_end, "DD-MM"),
                    ),
                    func.gn_commons.is_in_period(
                        func.date(self.model.date_max),
                        func.to_date(period_start, "DD-MM"),
                        func.to_date(period_end, "DD-MM"),
                    ),
                )
            )

        # generic filters
        for colname, value in self.filters.items():
            if colname.startswith("area"):
                self.add_join(
                    CorAreaSynthese, CorAreaSynthese.id_synthese, self.model.id_synthese
                )
                self.query = self.query.where(CorAreaSynthese.id_area.in_(value))
            else:
                col = getattr(self.model.__table__.columns, colname)
                self.query = self.query.where(col.in_(value))
示例#2
0
def filter_query_all_filters(model, q, filters, user):
    """
    Return a query filtered with the cruved and all
    the filters available in the synthese form
    parameters:
        - q (SQLAchemyQuery): an SQLAchemy query
        - filters (dict): a dict of filter
        - user (User): a user object from User
        - allowed datasets (List<int>): an array of ID dataset where the users have autorization

    """
    q = filter_query_with_cruved(model, q, user)

    if "observers" in filters:
        q = q.filter(model.observers.ilike("%" + filters.pop("observers")[0] + "%"))

    if "id_organism" in filters:
        id_datasets = (
            DB.session.query(CorDatasetActor.id_dataset)
            .filter(CorDatasetActor.id_organism.in_(filters.pop("id_organism")))
            .all()
        )
        formated_datasets = [d[0] for d in id_datasets]
        q = q.filter(model.id_dataset.in_(formated_datasets))

    if "date_min" in filters:
        q = q.filter(model.date_min >= filters.pop("date_min")[0])

    if "date_max" in filters:
        q = q.filter(model.date_min <= filters.pop("date_max")[0])

    if "id_acquisition_framework" in filters:
        q = q.join(
            TAcquisitionFramework,
            model.id_acquisition_framework
            == TAcquisitionFramework.id_acquisition_framework,
        )
        q = q.filter(
            TAcquisitionFramework.id_acquisition_framework.in_(
                filters.pop("id_acquisition_frameworks")
            )
        )

    if "geoIntersection" in filters:
        # Insersect with the geom send from the map
        ors = []
        for str_wkt in filters["geoIntersection"]:
            # if the geom is a circle
            if "radius" in filters:
                radius = filters.pop("radius")[0]
                wkt = loads(str_wkt)
                wkt = circle_from_point(wkt, float(radius))
            else:
                wkt = loads(str_wkt)
            geom_wkb = from_shape(wkt, srid=4326)
            ors.append(model.the_geom_4326.ST_Intersects(geom_wkb))

        q = q.filter(or_(*ors))
        filters.pop("geoIntersection")

    if "period_start" in filters and "period_end" in filters:
        period_start = filters.pop("period_start")[0]
        period_end = filters.pop("period_end")[0]
        q = q.filter(
            or_(
                func.gn_commons.is_in_period(
                    func.date(model.date_min),
                    func.to_date(period_start, "DD-MM"),
                    func.to_date(period_end, "DD-MM"),
                ),
                func.gn_commons.is_in_period(
                    func.date(model.date_max),
                    func.to_date(period_start, "DD-MM"),
                    func.to_date(period_end, "DD-MM"),
                ),
            )
        )
    q, filters = filter_taxonomy(model, q, filters)

    # generic filters
    join_on_cor_area = False
    for colname, value in filters.items():
        if colname.startswith("area"):
            if not join_on_cor_area:
                q = q.join(
                    CorAreaSynthese, CorAreaSynthese.id_synthese == model.id_synthese
                )
            q = q.filter(CorAreaSynthese.id_area.in_(value))
            join_on_cor_area = True
        else:
            col = getattr(model.__table__.columns, colname)
            q = q.filter(col.in_(value))
    return q
示例#3
0
def filter_query_all_filters(model, q, filters, user, allowed_datasets):
    """
    Return a query filtered with the cruved and all
    the filters available in the synthese form
    parameters:
        - q (SQLAchemyQuery): an SQLAchemy query
        - filters (dict): a dict of filter
        - user (TRoles): a user object from TRoles
        - allowed datasets (List<int>): an array of ID dataset where the users have autorization

    """

    # from geonature.core.users.models import UserRigth

    # user = UserRigth(
    #     id_role=user.id_role,
    #     tag_object_code='3',
    #     tag_action_code="R",
    #     id_organisme=user.id_organisme,
    #     nom_role='Administrateur',
    #     prenom_role='test'
    # )
    q = filter_query_with_cruved(model, q, user, allowed_datasets)

    if 'observers' in filters:
        q = q.filter(
            model.observers.ilike('%' + filters.pop('observers')[0] + '%'))

    if 'date_min' in filters:
        q = q.filter(model.date_min >= filters.pop('date_min')[0])

    if 'date_max' in filters:
        q = q.filter(model.date_min <= filters.pop('date_max')[0])

    if 'id_acquisition_frameworks' in filters:
        q = q.join(
            TAcquisitionFramework, model.id_acquisition_framework ==
            TAcquisitionFramework.id_acquisition_framework)
        q = q.filter(
            TAcquisitionFramework.id_acquisition_framework.in_(
                filters.pop('id_acquisition_frameworks')))

    if 'municipalities' in filters:
        q = q.filter(
            model.id_municipality.in_(
                [com for com in filters['municipalities']]))
        filters.pop('municipalities')

    if 'geoIntersection' in filters:
        # Insersect with the geom send from the map
        geom_wkt = loads(request.args['geoIntersection'])
        # if the geom is a circle
        if 'radius' in filters:
            radius = filters.pop('radius')[0]
            geom_wkt = circle_from_point(geom_wkt, float(radius))
        geom_wkb = from_shape(geom_wkt, srid=4326)
        q = q.filter(model.the_geom_4326.ST_Intersects(geom_wkb))
        filters.pop('geoIntersection')

    if 'period_start' in filters and 'period_end' in filters:
        period_start = filters.pop('period_start')[0]
        period_end = filters.pop('period_end')[0]
        q = q.filter(
            or_(
                func.gn_commons.is_in_period(
                    func.date(model.date_min),
                    func.to_date(period_start, 'DD-MM'),
                    func.to_date(period_end, 'DD-MM')),
                func.gn_commons.is_in_period(
                    func.date(model.date_max),
                    func.to_date(period_start, 'DD-MM'),
                    func.to_date(period_end, 'DD-MM'))))
    q, filters = filter_taxonomy(model, q, filters)

    # generic filters
    join_on_cor_area = False
    for colname, value in filters.items():
        if colname.startswith('area'):
            if not join_on_cor_area:
                q = q.join(CorAreaSynthese,
                           CorAreaSynthese.id_synthese == model.id_synthese)
            q = q.filter(CorAreaSynthese.id_area.in_(value))
            join_on_cor_area = True
        else:
            col = getattr(model.__table__.columns, colname)
            q = q.filter(col.in_(value))
    return q
示例#4
0
def filter_query_all_filters(model, q, filters, user):
    """
    Return a query filtered with the cruved and all
    the filters available in the synthese form
    parameters:
        - q (SQLAchemyQuery): an SQLAchemy query
        - filters (dict): a dict of filter
        - user (User): a user object from User
        - allowed datasets (List<int>): an array of ID dataset where the users have autorization

    """
    q = filter_query_with_cruved(model, q, user)

    if "observers" in filters:
        q = q.filter(model.observers.ilike(
            "%" + filters.pop("observers")[0] + "%"))

    if "id_organism" in filters:
        id_datasets = (
            DB.session.query(CorDatasetActor.id_dataset)
            .filter(CorDatasetActor.id_organism.in_(filters.pop("id_organism")))
            .all()
        )
        formated_datasets = [d[0] for d in id_datasets]
        q = q.filter(model.id_dataset.in_(formated_datasets))

    if "date_min" in filters:
        q = q.filter(model.date_min >= filters.pop("date_min")[0])

    if "date_max" in filters:
        # set the date_max at 23h59 because a hour can be set in timestamp
        date_max = datetime.datetime.strptime(
            filters.pop("date_max")[0], '%Y-%m-%d')
        date_max = date_max.replace(hour=23, minute=59, second=59)
        q = q.filter(model.date_max <= date_max)

    if "id_acquisition_framework" in filters:
        q = q.join(
            TAcquisitionFramework,
            model.id_acquisition_framework
            == TAcquisitionFramework.id_acquisition_framework,
        )
        q = q.filter(
            TAcquisitionFramework.id_acquisition_framework.in_(
                filters.pop("id_acquisition_frameworks")
            )
        )

    if "geoIntersection" in filters:
        # Intersect with the geom send from the map
        ors = []
        for str_wkt in filters["geoIntersection"]:
            # if the geom is a circle
            if "radius" in filters:
                radius = filters.pop("radius")[0]
                wkt = loads(str_wkt)
                wkt = circle_from_point(wkt, float(radius))
            else:
                wkt = loads(str_wkt)
            geom_wkb = from_shape(wkt, srid=4326)
            ors.append(model.the_geom_4326.ST_Intersects(geom_wkb))

        q = q.filter(or_(*ors))
        filters.pop("geoIntersection")

    if "period_start" in filters and "period_end" in filters:
        period_start = filters.pop("period_start")[0]
        period_end = filters.pop("period_end")[0]
        q = q.filter(
            or_(
                func.gn_commons.is_in_period(
                    func.date(model.date_min),
                    func.to_date(period_start, "DD-MM"),
                    func.to_date(period_end, "DD-MM"),
                ),
                func.gn_commons.is_in_period(
                    func.date(model.date_max),
                    func.to_date(period_start, "DD-MM"),
                    func.to_date(period_end, "DD-MM"),
                ),
            )
        )
    q, filters = filter_taxonomy(model, q, filters)

    # generic filters
    join_on_cor_area = False
    for colname, value in filters.items():
        if colname.startswith("area"):
            if not join_on_cor_area:
                q = q.join(
                    CorAreaSynthese, CorAreaSynthese.id_synthese == model.id_synthese
                )
            q = q.filter(CorAreaSynthese.id_area.in_(value))
            join_on_cor_area = True
        else:
            col = getattr(model.__table__.columns, colname)
            q = q.filter(col.in_(value))
    return q
示例#5
0
文件: query.py 项目: rorp24/GeoNature
def filter_query_all_filters(model, q, filters, user):
    """
    Return a query filtered with the cruved and all
    the filters available in the synthese form
    parameters:
        - q (SQLAchemyQuery): an SQLAchemy query
        - filters (dict): a dict of filter
        - user (User): a user object from User
        - allowed datasets (List<int>): an array of ID dataset where the users have autorization

    """
    q = filter_query_with_cruved(model, q, user)

    if "observers" in filters:
        q = q.filter(model.observers.ilike("%" + filters.pop("observers")[0] + "%"))

    if "date_min" in filters:
        q = q.filter(model.date_min >= filters.pop("date_min")[0])

    if "date_max" in filters:
        q = q.filter(model.date_min <= filters.pop("date_max")[0])

    if "id_acquisition_frameworks" in filters:
        q = q.join(
            TAcquisitionFramework,
            model.id_acquisition_framework
            == TAcquisitionFramework.id_acquisition_framework,
        )
        q = q.filter(
            TAcquisitionFramework.id_acquisition_framework.in_(
                filters.pop("id_acquisition_frameworks")
            )
        )

    if "geoIntersection" in filters:
        # Insersect with the geom send from the map
        ors = []
        for str_wkt in filters["geoIntersection"]:
            # if the geom is a circle
            if "radius" in filters:
                radius = filters.pop("radius")[0]
                wkt = circle_from_point(wkt, float(radius))
            else:
                wkt = loads(str_wkt)
            geom_wkb = from_shape(wkt, srid=4326)
            ors.append(model.the_geom_4326.ST_Intersects(geom_wkb))

        q = q.filter(or_(*ors))
        filters.pop("geoIntersection")

    if "period_start" in filters and "period_end" in filters:
        period_start = filters.pop("period_start")[0]
        period_end = filters.pop("period_end")[0]
        q = q.filter(
            or_(
                func.gn_commons.is_in_period(
                    func.date(model.date_min),
                    func.to_date(period_start, "DD-MM"),
                    func.to_date(period_end, "DD-MM"),
                ),
                func.gn_commons.is_in_period(
                    func.date(model.date_max),
                    func.to_date(period_start, "DD-MM"),
                    func.to_date(period_end, "DD-MM"),
                ),
            )
        )
    q, filters = filter_taxonomy(model, q, filters)

    # generic filters
    join_on_cor_area = False
    for colname, value in filters.items():
        if colname.startswith("area"):
            if not join_on_cor_area:
                q = q.join(
                    CorAreaSynthese, CorAreaSynthese.id_synthese == model.id_synthese
                )
            q = q.filter(CorAreaSynthese.id_area.in_(value))
            join_on_cor_area = True
        elif colname.startswith("modif_since_validation"):
            q = q.filter(model.meta_update_date > model.validation_date)
        else:
            col = getattr(model.__table__.columns, colname)
            q = q.filter(col.in_(value))
    return q