Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Relation reference filters #704

Merged
merged 9 commits into from
Jan 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion g3w-admin/client/static/client/js/app.min.js

Large diffs are not rendered by default.

32 changes: 23 additions & 9 deletions g3w-admin/core/api/base/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -456,9 +456,9 @@ def response_data_mode(self, request, export_features=False):
raise APIException(e)

# Paging cannot be a backend filter
if 'page' in request.query_params:
kwargs['page'] = request.query_params.get('page')
kwargs['page_size'] = request.query_params.get('page_size', 10)
if 'page' in self.request_data:
kwargs['page'] = self.request_data.get('page')
kwargs['page_size'] = self.request_data.get('page_size', 10)

# Make sure we have all attrs we need to build the server FID
provider = self.metadata_layer.qgis_layer.dataProvider()
Expand Down Expand Up @@ -489,19 +489,24 @@ def response_data_mode(self, request, export_features=False):
# --------------------------------------
# IDEA: for big data it'll be iterate over features to get unique
# c++ iteration is fast. Instead memory layer with too many features can be a problem.
if 'unique' in request.query_params or 'fformatter' in request.query_params:
#
# Get parameter from GET or POST requests


if ('unique' in self.request_data or 'fformatter' in self.request_data):

uniques = None
pvalue = request.query_params.get('unique') if 'unique' in request.query_params else (
request.query_params.get('fformatter'))

pvalue = self.request_data.get('unique') if 'unique' in self.request_data else (
self.request_data.get('fformatter'))

qfieldidx = self.metadata_layer.qgis_layer.fields().indexOf(pvalue)
r_qfieldidx = qfieldidx
qlayer = self.metadata_layer.qgis_layer
qfeatures = self.features

# Get QgsFieldFormatter
if 'fformatter' in request.query_params:
if 'fformatter' in self.request_data:
ewsetup = self.metadata_layer.qgis_layer.editorWidgetSetup(qfieldidx)
qfformatter = QGS_APPLICATION.fieldFormatterRegistry().fieldFormatter(ewsetup.type())

Expand Down Expand Up @@ -533,6 +538,12 @@ def response_data_mode(self, request, export_features=False):
req.user = request.user
req.resolver_match = resolve(url)
req.GET['unique'] = r_pvalue

# Add ffield if exists
# 'ffield' is a proxy parameter for /vector/api/data filter parameter 'field'
if 'ffield' in self.request_data:
req.GET['field'] = self.request_data.get('ffield')

view = LayerVectorView.as_view()
res = view(req, *[], **kwargs).render()
uniques = json.loads(res.content)['data']
Expand All @@ -556,7 +567,7 @@ def response_data_mode(self, request, export_features=False):
for u in uniques:
try:
if u:
if 'unique' in request.query_params:
if 'unique' in self.request_data:
values.append(json.loads(QgsJsonUtils.encodeValue(u)))
else:
fvalue = qfformatter.representValue(
Expand Down Expand Up @@ -596,7 +607,7 @@ def response_data_mode(self, request, export_features=False):

# check for formatter query url param and check if != 0
export_features = False
formatter = str(request.query_params.get('formatter', request.data.get('formatter')))
formatter = str(self.request_data.get('formatter', request.data.get('formatter')))
if formatter:
if formatter.isnumeric() and int(formatter) == 1:
export_features = True
Expand Down Expand Up @@ -706,6 +717,9 @@ def get_response(self, request, mode_call=None, project_type=None, layer_id=None
# set reprojecting status
self.set_reprojecting_status()

# Get request data by GET or POST method
self.request_data = request.query_params if request.method == 'GET' else request.data

# get results
response = self.get_response_data(request)

Expand Down
2 changes: 1 addition & 1 deletion g3w-admin/editing/static/editing/js/plugin.js

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion g3w-admin/editing/tests/test_api_transaction_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,11 @@ def test_mode_config(self):
'relation_reference': True,
'loading': {
'state': None
}
},
'filter_expression': None,
'chain_filters': None,
'filter_fields':None

}
}
}])
Expand Down
5 changes: 3 additions & 2 deletions g3w-admin/qdjango/utils/edittype.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,6 @@ def input_form(self):

input_form = super(QgisEditTypeRelationReference, self).input_form

# Explode Filter Expression
#filter_expression = explode_expression(self.FilterExpression) if self.FilterExpression != '' else None

# add params for get value
input_form['input']['options'].update({
Expand All @@ -234,6 +232,9 @@ def input_form(self):
'loading': {
'state': None
},
'filter_expression': self.FilterExpression if hasattr(self, 'FilterExpression') else None,
'chain_filters': self.ChainFilters if hasattr(self, 'ChainFilters') else None,
'filter_fields': self.FilterFields if hasattr(self, 'FilterFields') else None
})

return input_form
Expand Down
Loading