summaryrefslogtreecommitdiff
path: root/ishtar_common/views_item.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2021-12-23 11:03:43 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2022-12-12 12:20:59 +0100
commit86e7cdc9c8db51799b13378abbca9eb5ec7ec099 (patch)
tree140db349aed72e459f62bdefc36d2ef46e519fdb /ishtar_common/views_item.py
parent8b173f3397fd7f82cdc1b7377d1b62d5eec0eb14 (diff)
downloadIshtar-86e7cdc9c8db51799b13378abbca9eb5ec7ec099.tar.bz2
Ishtar-86e7cdc9c8db51799b13378abbca9eb5ec7ec099.zip
Syndication - fix pin search
Diffstat (limited to 'ishtar_common/views_item.py')
-rw-r--r--ishtar_common/views_item.py86
1 files changed, 58 insertions, 28 deletions
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py
index 88f20020b..404df6f90 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -14,6 +14,7 @@ from tempfile import NamedTemporaryFile
import unidecode
from django.conf import settings
+from django.contrib.contenttypes.models import ContentType
from django.contrib.gis.geos import GEOSException
from django.contrib.staticfiles.templatetags.staticfiles import static
from django.core.cache import cache
@@ -292,8 +293,7 @@ def show_source_item(request, source_id, model, name, base_dct, extra_dct):
models_rest.ApiExternalSource.objects.get()
# TODO: check permissions
try:
- src = models_rest.ApiExternalSource.objects.get(
- pk=source_id)
+ src = models_rest.ApiExternalSource.objects.get(pk=source_id)
except models_rest.ApiExternalSource.DoesNotExist:
return HttpResponse("{}", content_type="text/plain")
url = src.url
@@ -360,8 +360,7 @@ def show_item(model, name, extra_dct=None, model_for_perms=None):
dct["sheet_id"] = f"{name}-{pk}"
dct["window_id"] = f"{name}-{pk}-{datetime.datetime.now().strftime('%M%s')}"
if pk.startswith("source-"):
- return show_source_item(
- request, pk, model, name, dct, extra_dct)
+ return show_source_item(request, pk, model, name, dct, extra_dct)
try:
item = q.get(pk=pk)
except (ObjectDoesNotExist, ValueError):
@@ -537,8 +536,11 @@ def _get_values(request, val):
if callable(v):
v = v()
try:
- if not isinstance(v, (models.Person, models.Organization)) and\
- hasattr(v, "url") and v.url:
+ if (
+ not isinstance(v, (models.Person, models.Organization))
+ and hasattr(v, "url")
+ and v.url
+ ):
v = (
(request.is_secure() and "https" or "http")
+ "://"
@@ -1443,7 +1445,7 @@ def _get_data_from_query_old(
new_vals = []
for val in vals:
if ky.endswith("__count"):
- new_vals += [getattr(val, ky[:-len("__count")]).count()]
+ new_vals += [getattr(val, ky[: -len("__count")]).count()]
elif hasattr(val, "all"): # manage related objects
val = list(val.all())
for v in val:
@@ -1505,7 +1507,7 @@ def _get_json_stats(
if not stat:
continue
if stat.endswith("__year"):
- q = q.annotate(**{stat: ExtractYear(stat[:-len("__year")])})
+ q = q.annotate(**{stat: ExtractYear(stat[: -len("__year")])})
value_keys.append(stat)
q = q.values(*value_keys)
if stats_sum_variable == "pk":
@@ -1596,7 +1598,7 @@ def get_item(
no_link=False,
no_limit=False,
return_query=False,
- **dct
+ **dct,
):
available_perms = []
if specific_perms:
@@ -1715,8 +1717,13 @@ def get_item(
[
(
field.name,
- field.name + (hasattr(field, "remote_field")
- and field.remote_field and "__pk" or ""),
+ field.name
+ + (
+ hasattr(field, "remote_field")
+ and field.remote_field
+ and "__pk"
+ or ""
+ ),
)
for field in fields
]
@@ -1763,8 +1770,9 @@ def get_item(
if available:
for __, jkey, jfield in json_fields:
if jfield.alt_name not in request_keys:
- if isinstance(jfield, (forms.NullBooleanField,
- forms.BooleanField)):
+ if isinstance(
+ jfield, (forms.NullBooleanField, forms.BooleanField)
+ ):
my_bool_fields.append(jkey)
request_keys[jfield.alt_name] = jkey
else:
@@ -1800,7 +1808,7 @@ def get_item(
continue
key = k[:]
if key.startswith("searchprefix_"):
- key = key[len("searchprefix_"):]
+ key = key[len("searchprefix_") :]
dct_request_items[key] = request_items[k]
request_items = dct_request_items
@@ -1864,8 +1872,13 @@ def get_item(
if reversed_many_counted_fields:
whole_bool_fields += reversed_many_counted_fields[:]
has_a_search = any(
- k for k in dct.keys() if k not in base_keys and (
- dct[k] and (k not in whole_bool_fields or dct[k] != '1'))
+ k
+ for k in dct.keys()
+ if k not in base_keys
+ and (
+ dct[k]
+ and (k not in whole_bool_fields or dct[k] not in ("1", "unknown"))
+ )
)
# manage default and pinned search and not bookmark
if (
@@ -2405,7 +2418,7 @@ def adapt_distant_search(params, src, model):
source=src,
search_model__model__iexact=model,
search_keys__contains=[key],
- local_label=value
+ local_label=value,
)
up, down = match.span()
if q.count():
@@ -2420,16 +2433,10 @@ def adapt_distant_search(params, src, model):
params["search_vector"] = [final_search_vector]
-def get_distant_item(
- request,
- model,
- external_source_id,
- data_type=None
- ):
+def get_distant_item(request, model, external_source_id, data_type=None):
# TODO: check permissions
try:
- src = models_rest.ApiExternalSource.objects.get(
- pk=external_source_id)
+ src = models_rest.ApiExternalSource.objects.get(pk=external_source_id)
except (models_rest.ApiExternalSource.DoesNotExist, ValueError):
return HttpResponse("{}", content_type="text/plain")
url = src.url
@@ -2441,6 +2448,31 @@ def get_distant_item(
if data_type:
params["data_type"] = data_type
adapt_distant_search(params, src, model)
+
+ default_keys = [
+ "draw",
+ "order[",
+ "start",
+ "length",
+ "search[",
+ "_",
+ "submited",
+ "data_type",
+ ]
+ app = models_rest.MAIN_MODELS[model]
+ model_class = ContentType.objects.get(app_label=app, model=model).model_class()
+ bool_fields = model_class.REVERSED_BOOL_FIELDS + model_class.BOOL_FIELDS + model_class.CALLABLE_BOOL_FIELDS
+ is_empty_params = not any(
+ k
+ for k in params
+ if not any(k for default_key in default_keys if k.startswith(default_key))
+ and (k not in bool_fields or params.get(k) != ["unknown"])
+ )
+ pin_key = "pin-search-" + model
+ if (
+ is_empty_params and pin_key in request.session and request.session[pin_key]
+ ): # a search is pinned
+ params["search_vector"] = request.session[pin_key]
try:
response = requests.get(
url,
@@ -2455,7 +2487,7 @@ def get_distant_item(
for row in dct["rows"]:
if "id" in row:
try:
- idx = int(row['id'])
+ idx = int(row["id"])
except ValueError:
continue
source_id = f"source-{external_source_id}-{idx}"
@@ -2463,5 +2495,3 @@ def get_distant_item(
if "link" in row:
row["link"] = row["link"].replace(str(idx), source_id)
return HttpResponse(json.dumps(dct), content_type="application/json")
-
-