Guides: procedures written and read inside ShopDB

This commit is contained in:
2026-08-26 12:42:24 -04:00
parent 271d558f8b
commit f221fba540
27 changed files with 3152 additions and 12 deletions

View File

@@ -255,6 +255,55 @@ def _search_applications(query, search_term):
return results
def _search_guides(query, search_term):
"""Search guides by title, summary, tags and BODY.
The body matters more here than in most domains. People look for a procedure
by something written halfway down it - "the one about the drive letter" -
not by a title they never read. The body is a JSON blob of blocks, so this
is a LIKE against it: crude, but it finds the guide, and a guide corpus is
tens of documents rather than millions of rows.
PUBLISHED ONLY. A draft is deliberately invisible to readers, and search is
the one place that rule would otherwise leak - somebody would find a
half-written procedure through the search box and follow it.
"""
results = []
try:
_require_enabled('guides')
from plugins.guides.models import Guide
rows = Guide.query.filter(
Guide.isactive == True,
Guide.publishedrevisionid.isnot(None),
_word_match(query, Guide.title, Guide.summary, Guide.tags,
Guide.blocksjson)
).order_by(Guide.modifieddate.desc()).limit(20).all()
for guide in rows:
# A title match outranks a body match: someone searching "marker"
# wants the guide called that, not every guide mentioning one.
relevance = 10
if query.lower() in (guide.title or '').lower():
relevance += 20
if guide.tags and query.lower() in guide.tags.lower():
relevance += 15
results.append({
'type': 'guide',
'id': guide.guideid,
'title': guide.title,
'subtitle': guide.summary,
'url': f"/guides/{guide.slug}",
'relevance': relevance
})
except ImportError:
pass # guides plugin absent or disabled
except Exception as e:
logger.error(f"Guides search failed: {e}")
return results
def _search_knowledgebase(query, search_term):
"""Search Knowledge Base by description and keywords.
@@ -1148,6 +1197,7 @@ def global_search():
# Run all search domains
results.extend(_search_applications(query, search_term))
results.extend(_search_knowledgebase(query, search_term))
results.extend(_search_guides(query, search_term))
results.extend(_search_employees(query, search_term))
results.extend(_search_assets(query, search_term))
results.extend(_search_measuringtools(query, search_term))

View File

@@ -101,6 +101,7 @@ IDENTIFIER_ASSETTYPES = ['machine', 'computer', 'printer', 'network_device',
SEARCH_DOMAINS = {
'application': 'Applications',
'knowledgebase': 'Knowledge Base',
'guide': 'Guides',
'employee': 'Employees',
'machine': 'Machines',
'computer': 'PCs',