summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/models_imports.py6
-rw-r--r--ishtar_common/views_api.py2
-rw-r--r--ishtar_common/views_item.py62
3 files changed, 64 insertions, 6 deletions
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index dd675e840..2b568df21 100644
--- a/ishtar_common/models_imports.py
+++ b/ishtar_common/models_imports.py
@@ -291,6 +291,12 @@ class ImporterType(models.Model):
def importer_groups_label(self) -> str:
return " ; ".join([imp.group.name for imp in self.groups.all()])
+ def get_gis_import_key(self):
+ for default in self.defaults.filter(target__endswith="geodata").all():
+ q = default.default_values.filter(target="import_key")
+ if q.count():
+ return q.all()[0].value
+
def get_libreoffice_template(self):
if not UnoCalc:
return
diff --git a/ishtar_common/views_api.py b/ishtar_common/views_api.py
index fe301b04d..6c0f8107b 100644
--- a/ishtar_common/views_api.py
+++ b/ishtar_common/views_api.py
@@ -107,6 +107,7 @@ class GISExportAPI(GISBaseImportView, GISAPIView):
dct["start"] = (page - 1) * self.PAGE_LEN + 1
try:
importer_class = importer.get_importer_class()
+ import_key = importer.get_gis_import_key()
cols, col_names = importer.get_columns(importer_class=importer_class)
obj_name = importer_class.OBJECT_CLS.__name__.lower()
return get_item(importer_class.OBJECT_CLS, "get_" + obj_name, obj_name,
@@ -114,6 +115,7 @@ class GISExportAPI(GISBaseImportView, GISAPIView):
request, data_type="json", full=False, force_own=False,
no_link=True, col_names=col_names,
col_types=importer.get_columns_types(),
+ geo_import_key=import_key,
**dct
)
except ImporterError as e:
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