summaryrefslogtreecommitdiff
path: root/ishtar_common/views_item.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-09-11 01:32:42 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-10-15 19:33:00 +0200
commit581cf23c4ffdd35eef8ca21c489a3a576062f027 (patch)
tree5b365f73cd26f9e5b0c9234f465ae6175930e745 /ishtar_common/views_item.py
parent7c5cdd8c6028bce79039ab0e0c9dedb20c1854a7 (diff)
downloadIshtar-581cf23c4ffdd35eef8ca21c489a3a576062f027.tar.bz2
Ishtar-581cf23c4ffdd35eef8ca21c489a3a576062f027.zip
✨ GIS API: manage import_key for export
Diffstat (limited to 'ishtar_common/views_item.py')
-rw-r--r--ishtar_common/views_item.py62
1 files changed, 56 insertions, 6 deletions
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py
index 5e9135c7a..3ca98979f 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -1874,8 +1874,9 @@ def _format_geojson(rows, link_template, display_polygon):
def _get_data_from_query(items, query_table_cols, extra_request_keys,
- geo_fields=None):
+ geo_fields=None, geo_import_key=None, q_slice=None):
# TODO: manage data json field
+
for query_keys in query_table_cols:
if not isinstance(query_keys, (tuple, list)):
query_keys = [query_keys]
@@ -1914,7 +1915,50 @@ def _get_data_from_query(items, query_table_cols, extra_request_keys,
values.append("locked")
values.append("lock_user_id")
values = [v for v in values if v] # filter empty values
- return items.values_list(*values)
+ if q_slice:
+ result = items[q_slice[0]:q_slice[1]].values_list(*values)
+ else:
+ result = items.values_list(*values)
+ if not geo_import_key:
+ return result
+
+ # get correct data with geo_import_key match
+ geo_prefix = None
+ for k in query_table_cols:
+ # get geodata prefix
+ if "geodata" in k:
+ geo_prefix = k[:k.index("geodata")]
+ break
+ if geo_prefix is None:
+ # no real geodata
+ return result
+ geo_values = ["id"]
+ column_index = {}
+ for idx, k in enumerate(query_table_cols):
+ if k.startswith(f"{geo_prefix}geodata"):
+ geo_values.append(k)
+ column_index[k] = idx + 1
+
+ new_geo_values = {}
+ q2 = items.filter(**{f"{geo_prefix}geodata__import_key": geo_import_key})
+ if q_slice:
+ q2 = q2[q_slice[0]:q_slice[1]]
+ for geo_result in q2.values_list(*geo_values):
+ new_geo_values[geo_result[0]] = geo_result
+ new_values = []
+ for v in result:
+ v = list(v)
+ if v[0] not in new_geo_values: # 0 is id
+ for geo_value in geo_values[1:]:
+ idx = column_index[geo_value]
+ v[idx] = ""
+ else:
+ geo_res = new_geo_values[v[0]]
+ for geo_value in geo_values[1:]:
+ idx = column_index[geo_value]
+ v[idx] = geo_res[idx]
+ new_values.append(v)
+ return new_values
def _get_data_from_query_old(
@@ -2465,6 +2509,8 @@ def get_item(
copy(relation_types_prefix) if relation_types_prefix else {}
)
+ geo_import_key = dct.get("geo_import_key", None)
+
fields = [model._meta.get_field(k) for k in get_all_field_names(model)]
request_keys = dict(
@@ -2973,12 +3019,15 @@ def get_item(
slice_query = (start, end)
callback("get_item", request, data_type, items, slice_query)
+ q_slice = []
if manual_sort_key:
items = items.all()
else:
- items = items[start:end]
+ q_slice = [start, end]
if old:
+ if q_slice:
+ items = items[q_slice[0]:q_slice[1]]
items = [item.get_previous(old) for item in items]
if data_type == "json-map":
@@ -2988,11 +3037,13 @@ def get_item(
geo_fields = query_table_cols[-2:]
datas = _get_data_from_query(
items, query_table_cols, my_extra_request_keys,
- geo_fields=geo_fields
+ geo_fields=geo_fields, q_slice=q_slice
)
elif data_type != "csv" and getattr(model, "NEW_QUERY_ENGINE", False):
- datas = _get_data_from_query(items, query_table_cols, my_extra_request_keys)
+ datas = _get_data_from_query(items, query_table_cols, my_extra_request_keys, geo_import_key=geo_import_key, q_slice=q_slice)
else:
+ if q_slice:
+ items = items[q_slice[0]:q_slice[1]]
datas = _get_data_from_query_old(
items,
query_table_cols,
@@ -3000,7 +3051,6 @@ def get_item(
my_extra_request_keys,
do_not_deduplicate,
)
-
if manual_sort_key:
# +1 because the id is added as a first col
idx_col = None