ckanext-search-tweaks 0.6.1.post1__py3-none-any.whl → 0.6.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,24 @@
1
+ version: 1
2
+ groups:
3
+ - annotation: "ckanext-search-tweaks: common"
4
+ options:
5
+ - key: ckanext.search_tweaks.common.qf
6
+ placeholder: "name^4 title^4 tags^2 groups^2 text"
7
+
8
+ - key: ckanext.search_tweaks.common.mm
9
+ default: "1"
10
+
11
+ - key: ckanext.search_tweaks.common.fuzzy_search.enabled
12
+ type: bool
13
+
14
+ - key: ckanext.search_tweaks.common.fuzzy_search.distance
15
+ type: int
16
+ default: 1
17
+
18
+ - key: ckanext.search_tweaks.common.fuzzy_search.keep_original
19
+ type: bool
20
+ default: true
21
+
22
+ - key: ckanext.search_tweaks.common.prefer_boost
23
+ type: bool
24
+ default: true
@@ -15,10 +15,10 @@ CONFIG_BOOST_FN = "ckanext.search_tweaks.field_relevance.boost_function"
15
15
  DEFAULT_BOOST_FN = None
16
16
 
17
17
 
18
+ @tk.blanket.blueprints
18
19
  class FieldRelevancePlugin(p.SingletonPlugin):
19
20
  p.implements(ISearchTweaks, inherit=True)
20
21
  p.implements(p.IAuthFunctions)
21
- p.implements(p.IBlueprint)
22
22
  p.implements(p.IConfigurer, inherit=True)
23
23
 
24
24
  # ISearchTweaks
@@ -28,11 +28,6 @@ class FieldRelevancePlugin(p.SingletonPlugin):
28
28
 
29
29
  return tk.config.get(CONFIG_BOOST_FN, DEFAULT_BOOST_FN)
30
30
 
31
- # IBlueprint
32
-
33
- def get_blueprint(self):
34
- return views.get_blueprints()
35
-
36
31
  # IConfigurer
37
32
 
38
33
  def update_config(self, config):
@@ -17,7 +17,7 @@
17
17
  <form id="dataset-edit" class="dataset-form" method="post" action="{{ action }}" data-module="basic-form" novalidate>
18
18
 
19
19
  {% call form.input_block(field_name, _("Promotion level"), errors[field_name], classes=["search-tweaks-label-with-value"]) %}
20
- <input data-module="search-tweaks-reflect-range-in-label" data-module-format=" (%d)" id="{{ field_name }}" type="range" name="{{ field_name }}" value="{{ data[field_name] }}" max="{{ max_promotion }}" />
20
+ <input data-module="search-tweaks-reflect-range-in-label" data-module-format=" (%d)" id="{{ field_name }}" type="range" name="{{ field_name }}" value="{{ data[field_name] }}" min="{{ min_promotion }}" max="{{ max_promotion }}" />
21
21
  {% endcall %}
22
22
 
23
23
  {% block form_actions %}
@@ -12,6 +12,9 @@ CONFIG_ENABLE_PROMOTION_ROUTE = (
12
12
  "ckanext.search_tweaks.field_relevance.blueprint.promotion.enabled"
13
13
  )
14
14
  CONFIG_PROMOTION_PATH = "ckanext.search_tweaks.field_relevance.blueprint.promotion.path"
15
+ CONFIG_MIN_PROMOTION = (
16
+ "ckanext.search_tweaks.field_relevance.blueprint.promotion.min_value"
17
+ )
15
18
  CONFIG_MAX_PROMOTION = (
16
19
  "ckanext.search_tweaks.field_relevance.blueprint.promotion.max_value"
17
20
  )
@@ -21,22 +24,13 @@ CONFIG_PROMOTION_FIELD = (
21
24
 
22
25
  DEFAULT_ENABLE_PROMOTION_ROUTE = False
23
26
  DEFAULT_PROMOTION_PATH = "/dataset/promote/<id>"
27
+ DEFAULT_MIN_PROMOTION = 0
24
28
  DEFAULT_MAX_PROMOTION = 100
25
29
  DEFAULT_PROMOTION_FIELD = "promotion_level"
26
30
 
27
31
  field_relevance = Blueprint("search_tweaks_field_relevance", __name__)
28
32
 
29
33
 
30
- def get_blueprints():
31
- if tk.asbool(
32
- tk.config.get(CONFIG_ENABLE_PROMOTION_ROUTE, DEFAULT_ENABLE_PROMOTION_ROUTE),
33
- ):
34
- path = tk.config.get(CONFIG_PROMOTION_PATH, DEFAULT_PROMOTION_PATH)
35
- field_relevance.add_url_rule(path, view_func=PromoteView.as_view("promote"))
36
-
37
- return [field_relevance]
38
-
39
-
40
34
  class PromoteView(MethodView):
41
35
  def _check_access(self, id: str) -> None:
42
36
  try:
@@ -50,7 +44,7 @@ class PromoteView(MethodView):
50
44
  schema = {
51
45
  field: [
52
46
  tk.get_validator("convert_int"),
53
- tk.get_validator("natural_number_validator"),
47
+ tk.get_validator("int_validator"),
54
48
  tk.get_validator("limit_to_configured_maximum")(
55
49
  CONFIG_MAX_PROMOTION, DEFAULT_MAX_PROMOTION,
56
50
  ),
@@ -89,6 +83,10 @@ class PromoteView(MethodView):
89
83
  "pkg_dict": pkg_dict,
90
84
  "errors": errors or {},
91
85
  "data": data or pkg_dict,
86
+ "min_promotion": tk.asint(
87
+ tk.config.get(CONFIG_MIN_PROMOTION, DEFAULT_MIN_PROMOTION),
88
+ ),
89
+
92
90
  "max_promotion": tk.asint(
93
91
  tk.config.get(CONFIG_MAX_PROMOTION, DEFAULT_MAX_PROMOTION),
94
92
  ),
@@ -96,3 +94,9 @@ class PromoteView(MethodView):
96
94
  }
97
95
 
98
96
  return tk.render("search_tweaks/field_relevance/promote.html", extra_vars)
97
+
98
+
99
+ if tk.asbool(
100
+ tk.config.get(CONFIG_ENABLE_PROMOTION_ROUTE, DEFAULT_ENABLE_PROMOTION_ROUTE),
101
+ ):
102
+ field_relevance.add_url_rule("/dataset/promote/<id>", view_func=PromoteView.as_view("promote"))
@@ -0,0 +1,29 @@
1
+ version: 1
2
+ groups:
3
+ - annotation: "ckanext-search-tweaks: query popularity"
4
+ options:
5
+ - key: ckanext.search_tweaks.query_popularity.skip_irrefutable_search
6
+ type: bool
7
+ default: true
8
+
9
+ - key: ckanext.search_tweaks.query_popularity.ignored_symbols
10
+ default: ":"
11
+
12
+ - key: ckanext.search_tweaks.query_popularity.ignored_terms
13
+ type: list
14
+
15
+ - key: ckanext.search_tweaks.query_popularity.tracked_endpoints
16
+ type: list
17
+ default: dataset.search
18
+
19
+ - key: ckanext.search_tweaks.query_popularity.query_throttle
20
+ type: int
21
+ default: 86_400 # 24 hours
22
+
23
+ - key: ckanext.search_tweaks.query_popularity.max_age
24
+ type: int
25
+ default: 2_592_000 # 30 days
26
+
27
+ - key: ckanext.search_tweaks.query_popularity.obsoletion_period
28
+ type: int
29
+ default: 86_400 # 24 hours
@@ -1,16 +1,21 @@
1
+ from __future__ import annotations
2
+
1
3
  import csv
2
4
  import datetime
3
-
5
+ import logging
4
6
  import click
5
7
  import freezegun
6
8
 
7
9
  import ckan.model as model
8
10
  from ckan.lib.redis import connect_to_redis
11
+ from ckan.lib.search import rebuild
9
12
 
10
13
  from . import QueryScore
11
14
 
12
15
  _search_csv_headers = ["package_id", "search_query", "count_of_hits"]
13
16
 
17
+ log = logging.getLogger(__name__)
18
+
14
19
 
15
20
  @click.group(short_help="Manage search relevance")
16
21
  def query():
@@ -86,3 +91,18 @@ def safe_export(ctx, days, file):
86
91
  fg="red",
87
92
  )
88
93
  ctx.invoke(import_source, source=click.File()(file))
94
+
95
+
96
+ @query.command()
97
+ def index():
98
+ """Re-index datasets that have query relevance scores.
99
+ """
100
+
101
+ storage = QueryScore.default_storage_class()
102
+ ids = {id for id, _, _ in storage.scan()}
103
+ with click.progressbar(ids) as bar:
104
+ for id in bar:
105
+ try:
106
+ rebuild(id)
107
+ except Exception:
108
+ log.exception("Cannot index %s", id)
@@ -49,24 +49,14 @@ class QueryRelevancePlugin(plugins.SingletonPlugin):
49
49
  # ISearchTweaks
50
50
 
51
51
  def get_search_boost_fn(self, search_params: dict[str, Any]) -> str | None:
52
- if feature_disabled("query_boost", search_params):
53
- return None
54
-
55
- prefix = tk.config.get(CONFIG_RELEVANCE_PREFIX, DEFAULT_RELEVANCE_PREFIX)
56
- disabled = tk.asbool(
57
- search_params.get("extras", {}).get(
58
- "ext_search_tweaks_disable_relevance",
59
- False,
60
- ),
61
- )
62
-
63
- if not search_params.get("q") or disabled:
52
+ if feature_disabled("query_boost", search_params) or not search_params.get("q"):
64
53
  return None
65
54
 
66
55
  normalized = normalize_query(search_params["q"]).replace(" ", "_")
67
56
  if not normalized:
68
57
  return None
69
58
 
59
+ prefix = tk.config.get(CONFIG_RELEVANCE_PREFIX, DEFAULT_RELEVANCE_PREFIX)
70
60
  field = prefix + normalized
71
61
  boost_string = Template(
72
62
  tk.config.get(CONFIG_BOOST_STRING, DEFAULT_BOOST_STRING),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ckanext-search-tweaks
3
- Version: 0.6.1.post1
3
+ Version: 0.6.3
4
4
  Author-email: DataShades <datashades@linkdigital.com.au>, Sergey Motornyuk <sergey.motornyuk@linkdigital.com.au>
5
5
  Maintainer-email: DataShades <datashades@linkdigital.com.au>
6
6
  License: AGPL
@@ -14,8 +14,8 @@ Classifier: Programming Language :: Python :: 3.10
14
14
  Description-Content-Type: text/markdown
15
15
  License-File: LICENSE
16
16
  Requires-Dist: freezegun
17
- Requires-Dist: typing-extensions >=4.0.0
18
- Requires-Dist: ckanext-toolbelt >=0.4.11
17
+ Requires-Dist: typing_extensions>=4.0.0
18
+ Requires-Dist: ckanext-toolbelt>=0.4.11
19
19
  Provides-Extra: advanced-search
20
20
 
21
21
  [![Tests](https://github.com/DataShades/ckanext-search-tweaks/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/DataShades/ckanext-search-tweaks/actions)
@@ -2,6 +2,7 @@ ckanext/__init__.py,sha256=xsigU4VzvLfcHEa08OUsv-05ZXU-qwjs3Y3f6PWA7fY,203
2
2
  ckanext/search_tweaks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  ckanext/search_tweaks/cli.py,sha256=Pex34fMESkVycy6kOfODtNmHh8nPMvzFKTeZD0txLvc,308
4
4
  ckanext/search_tweaks/config.py,sha256=NX7rsslGJyxQ8xTZidy9fI-SDkJ4lX4oLTX54lVLGI0,941
5
+ ckanext/search_tweaks/config_declaration.yaml,sha256=XrlvWGhlnVPGTJfbRj4Fxf0o8Q9UiS1bYKolnAoY8bg,644
5
6
  ckanext/search_tweaks/interfaces.py,sha256=pOu2PyMVxu7XDyGCvP42upm5N4Ws1KR0qzyW8wE2CGY,869
6
7
  ckanext/search_tweaks/plugin.py,sha256=Bk1ejlTsKxUcIjckuzQBj_nwUbIz7H5t-AwqtmCvaIw,3330
7
8
  ckanext/search_tweaks/shared.py,sha256=9aWN_OXB5-h99lecnZVoZpLY6F8hbIRNX6WUQaoOoYI,325
@@ -12,13 +13,14 @@ ckanext/search_tweaks/advanced_search/assets/advanced-search.js,sha256=rkgprbv9f
12
13
  ckanext/search_tweaks/advanced_search/assets/webassets.yml,sha256=g0NMsLyHzslxtkIXRFj_Vf-SU6b8MYlBiuHc50SQiAo,439
13
14
  ckanext/search_tweaks/advanced_search/templates/advanced_search/search_form.html,sha256=QlKCxEUDGP1g4oZEOKAGSuopjrJsbcgK2cs28k3X4Vc,4266
14
15
  ckanext/search_tweaks/field_relevance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- ckanext/search_tweaks/field_relevance/plugin.py,sha256=89hK-S_Ox0IwFKbN5wINmyCug4_pRIl-8pvVQVF_xnk,1432
16
- ckanext/search_tweaks/field_relevance/views.py,sha256=vtSOFXRgmzcypLkl_ZBs-enDk0raE2GPd_ruIKJv8IA,3214
16
+ ckanext/search_tweaks/field_relevance/plugin.py,sha256=f5VQcu5PfBncXM6WVLsMDze9fQe20LmNvot51mui3Jg,1338
17
+ ckanext/search_tweaks/field_relevance/views.py,sha256=yAkoZrxtEKiSRMYmXHeq_bS3nGi6QtiC6zEOSu0kn5g,3336
17
18
  ckanext/search_tweaks/field_relevance/assets/search-tweaks-reflect-range-in-label.js,sha256=WFAzPBvzf6SWaEAQJTxiEGhZm-65o676MN6KttCpvbo,490
18
19
  ckanext/search_tweaks/field_relevance/assets/webassets.yml,sha256=PGr_EC4jOTABCRc3JCIAqYCzCMNgGG1KYE6Ua0S0vfk,184
19
- ckanext/search_tweaks/field_relevance/templates/search_tweaks/field_relevance/promote.html,sha256=uqB9Wf7OJzF3-Ep6VZwe3bYICdzy0JhJPJzNPuMLBr0,1118
20
+ ckanext/search_tweaks/field_relevance/templates/search_tweaks/field_relevance/promote.html,sha256=yMoVwcpiSl7XM-EaoznDe5MiRY3G1zcBywAI1IZhKj4,1144
20
21
  ckanext/search_tweaks/query_popularity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
22
  ckanext/search_tweaks/query_popularity/config.py,sha256=O-YptWOeDQ6tyVLZ10D3dVs5tGhjOoOtFY3Xw_InmjA,858
23
+ ckanext/search_tweaks/query_popularity/config_declaration.yaml,sha256=asztZ5jFcfOQoS0Wq-pC41scC3w2ahNEP2AhIMMO2PM,866
22
24
  ckanext/search_tweaks/query_popularity/plugin.py,sha256=ih9c7CrI-A1ilfe9I1Hb_3BdMOnzNsTyMfJA7c0Qs8A,1391
23
25
  ckanext/search_tweaks/query_popularity/score.py,sha256=JfOiR7yj22euNrIX3T_VYjzB7ilGpDmr4hmXFHfsSAc,1052
24
26
  ckanext/search_tweaks/query_popularity/logic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -26,8 +28,8 @@ ckanext/search_tweaks/query_popularity/logic/action.py,sha256=uG6IdAX2b8YztmcxiA
26
28
  ckanext/search_tweaks/query_popularity/logic/auth.py,sha256=6jddjTxo9NX_a-_jQz_8Mj7273zfkfZz1_BOW6JzHm0,670
27
29
  ckanext/search_tweaks/query_popularity/logic/schema.py,sha256=rgjmRyGb7zlBOLZo284XcH9F6VepmIv5yvoxTGxLByA,301
28
30
  ckanext/search_tweaks/query_relevance/__init__.py,sha256=mGpZuwY8UwPMuxjNLhGVYoaXPfLx5UPMixpldIjZuSY,1467
29
- ckanext/search_tweaks/query_relevance/cli.py,sha256=7wU3nWdCQNaUi2O_zARy7usvUysE-wnp5h_yRlw7nAo,2576
30
- ckanext/search_tweaks/query_relevance/plugin.py,sha256=W9qmwWD_wThedqpLNgxNY--N0TsHtPDoW4EfcbaWGhw,2448
31
+ ckanext/search_tweaks/query_relevance/cli.py,sha256=34bgBphi28vOu08H3TBrm7ssKj9_6gXiQU1SNzAs7bM,3083
32
+ ckanext/search_tweaks/query_relevance/plugin.py,sha256=49lJXKeahwyFAMEh063YGF7SGNBcqpcojNA2TUSlkQ8,2219
31
33
  ckanext/search_tweaks/query_relevance/score.py,sha256=hfrfgNP5OUf7YBBDuFFBZb66ixpiAlnM-KAXzUVexXc,1811
32
34
  ckanext/search_tweaks/query_relevance/storage.py,sha256=7SP1arTjTvbHrWDZhzu9E0pWxk4ygz3NcpDk7P4YODk,4852
33
35
  ckanext/search_tweaks/spellcheck/__init__.py,sha256=Af3LHk9L82QtAh4q7C3srzCwJiF6WCtxe4CFTPKhFMQ,1401
@@ -44,9 +46,9 @@ ckanext/search_tweaks/tests/query_relevance/test_score.py,sha256=RwG_o8QyW3BZBx3
44
46
  ckanext/search_tweaks/tests/query_relevance/test_storage.py,sha256=xBHB69zHE301mHlUB2hz0RXJaqFrhRMesAz2LNYNFE0,2825
45
47
  ckanext/search_tweaks/tests/spellcheck/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
48
  ckanext/search_tweaks/tests/spellcheck/test_plugin.py,sha256=4pocLV8uzea2ua8LUTC3IXlyYc3oKbhApODA1uWHNFU,2517
47
- ckanext_search_tweaks-0.6.1.post1.dist-info/LICENSE,sha256=2lWcRAHjsQhqavGNnR30Ymxq3GJ9BaYL_dnfGO_-WFA,34500
48
- ckanext_search_tweaks-0.6.1.post1.dist-info/METADATA,sha256=-ES_Zxv8rown_0E33sqp3Z74FqlIF4IHojk0DdzIo9I,12255
49
- ckanext_search_tweaks-0.6.1.post1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
50
- ckanext_search_tweaks-0.6.1.post1.dist-info/entry_points.txt,sha256=0hvD0BILJCAPZBOTH28bAMN8XCbPrltTZ6Q8-mUZGyE,615
51
- ckanext_search_tweaks-0.6.1.post1.dist-info/top_level.txt,sha256=5yjNwq-s42weaiMMUuA5lZ45g99ANsfcRBCvac1JMS4,8
52
- ckanext_search_tweaks-0.6.1.post1.dist-info/RECORD,,
49
+ ckanext_search_tweaks-0.6.3.dist-info/LICENSE,sha256=2lWcRAHjsQhqavGNnR30Ymxq3GJ9BaYL_dnfGO_-WFA,34500
50
+ ckanext_search_tweaks-0.6.3.dist-info/METADATA,sha256=7u9irDZzibOQ5AJmjYFiLBdXz-1ecdR--DLPMaVn6Xk,12247
51
+ ckanext_search_tweaks-0.6.3.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
52
+ ckanext_search_tweaks-0.6.3.dist-info/entry_points.txt,sha256=0hvD0BILJCAPZBOTH28bAMN8XCbPrltTZ6Q8-mUZGyE,615
53
+ ckanext_search_tweaks-0.6.3.dist-info/top_level.txt,sha256=5yjNwq-s42weaiMMUuA5lZ45g99ANsfcRBCvac1JMS4,8
54
+ ckanext_search_tweaks-0.6.3.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.2.0)
2
+ Generator: setuptools (75.7.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5