From 1c7d825d47965665c97406448af3fa513a1fe412 Mon Sep 17 00:00:00 2001 From: Walter Lorenzetti Date: Wed, 14 Feb 2024 09:42:36 +0100 Subject: [PATCH] :bug: Fix session filter feature by selection fo PostgreSql layers (#756) * Move get layer fids from sever fids on model get expression * Only expression template '$id IN (...)'. --------- Co-authored-by: wlorenzetti (cherry picked from commit 6ba93816bfda3756a85013b2881e59c076098e75) --- g3w-admin/qdjango/models/filters.py | 14 +++++++++++++- g3w-admin/qdjango/tests/test_api.py | 10 +++++----- g3w-admin/qdjango/vector.py | 12 ------------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/g3w-admin/qdjango/models/filters.py b/g3w-admin/qdjango/models/filters.py index accfe8272..a08bd6bd7 100644 --- a/g3w-admin/qdjango/models/filters.py +++ b/g3w-admin/qdjango/models/filters.py @@ -16,12 +16,14 @@ from django.utils.crypto import salted_hmac from model_utils.models import TimeStampedModel from usersmanage.models import User +from core.utils.qgisapi import get_layer_fids_from_server_fids from .projects import Layer from datetime import datetime import time import six import base64 import logging +import re logger = logging.getLogger(__name__) @@ -80,7 +82,17 @@ def get_expr_for_token(cls, token, layer): f"More than one token or more expressions for this layer '{layer.qgs_layer_id}' exist: skipping filtering!") return "" else: - return stf_layers[0].qgs_expr + + qgs_expr = stf_layers[0].qgs_expr + ids = re.findall(r'\((.*?)\)', stf_layers[0].qgs_expr) + + # Check for `postgres` layer and qgis expression template '$id IN (...)' + if layer.layer_type == 'postgres' and len(ids) == 1: + fids = ids[0].split(',') + fids = get_layer_fids_from_server_fids(map(str, fids), layer.qgis_layer) + return f"$id IN ({','.join(map(str, fids))})" + else: + return qgs_expr class Meta: app_label = 'qdjango' diff --git a/g3w-admin/qdjango/tests/test_api.py b/g3w-admin/qdjango/tests/test_api.py index a5737a8ce..9647883aa 100644 --- a/g3w-admin/qdjango/tests/test_api.py +++ b/g3w-admin/qdjango/tests/test_api.py @@ -1137,7 +1137,7 @@ def test_tokenfilter_mode_api(self): self.assertEqual(resp['data'], { 'layer': cities.qgs_layer_id, - 'qgs_expression': '$id NOT IN (9,8,6,0)', + 'qgs_expression': '$id NOT IN (6,8,9,0)', 'name': 'filter 1 layer cities', 'fid': 1, 'state': 'created' @@ -1154,7 +1154,7 @@ def test_tokenfilter_mode_api(self): self.assertEqual(resp['data'], { 'layer': cities.qgs_layer_id, - 'qgs_expression': '$id NOT IN (9,8,6,0)', + 'qgs_expression': '$id NOT IN (6,8,9,0)', 'name': 'filter 1 layer cities', 'fid': 1, 'state': 'updated' @@ -1180,7 +1180,7 @@ def test_tokenfilter_mode_api(self): self.assertEqual(resp['data'], { 'layer': cities.qgs_layer_id, - 'qgs_expression': '$id NOT IN (9,8,6,0) AND $id NOT IN (2,1)', + 'qgs_expression': '$id NOT IN (6,8,9,0) AND $id NOT IN (1,2)', 'name': 'filter 2 layer cities', 'fid': 2, 'state': 'created' @@ -1213,7 +1213,7 @@ def test_tokenfilter_mode_api(self): # Check inside the current fitlertoken token = sf.token - self.assertEqual(sf.stf_layers.all()[0].qgs_expr, '$id NOT IN (9,8,6,0)') + self.assertEqual(sf.stf_layers.all()[0].qgs_expr, '$id NOT IN (6,8,9,0)') # Delete fitler token and apply again to check for new fitler token value SessionTokenFilter.objects.all().delete() @@ -1226,7 +1226,7 @@ def test_tokenfilter_mode_api(self): }, logout=False).content) sf = SessionTokenFilter.objects.all()[0] self.assertFalse(token == sf.token) - self.assertEqual(sf.stf_layers.all()[0].qgs_expr, '$id NOT IN (9,8,6,0)') + self.assertEqual(sf.stf_layers.all()[0].qgs_expr, '$id NOT IN (6,8,9,0)') # Filter for layer check /api/config REST API: resp = json.loads(self._testApiCall('group-project-map-config', diff --git a/g3w-admin/qdjango/vector.py b/g3w-admin/qdjango/vector.py index 235e99920..bf2050c6a 100644 --- a/g3w-admin/qdjango/vector.py +++ b/g3w-admin/qdjango/vector.py @@ -417,18 +417,6 @@ def _get_sessiontokenfilter(): fidsin = request_data.get('fidsin') fidsout = request_data.get('fidsout') - # Get layer fids from server fids - if fidsin: - fidsin = get_layer_fids_from_server_fids([str(fid) for fid in fidsin.split(',')], - self.metadata_layer.qgis_layer) - fidsin.reverse() - fidsin = ",".join(map(str, fidsin)) - if fidsout: - fidsout = get_layer_fids_from_server_fids([str(fid) for fid in fidsout.split(',')], - self.metadata_layer.qgis_layer) - fidsout.reverse() - fidsout = ",".join(map(str, fidsout)) - token_data = {} def _create_qgs_expr(s, fidsin=None, fidsout=None):