shop-old/modules/import/python_search.py
2026-04-20 01:03:43 +02:00

116 lines
3.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Command-line search script - called by PHP
Usage: python3 python_search.py "search_term"
Output: JSON array of items
"""
import json
import sys
import pymysql
import os
from configparser import ConfigParser
CONFIG_PATH = os.path.join(os.path.dirname(__file__), 'db_config.ini')
def load_db_config():
"""Load database config from ini file"""
parser = ConfigParser()
parser.read(CONFIG_PATH)
config = parser['database']
return {
'host': config.get('host', 'localhost'),
'user': config.get('user'),
'password': config.get('password'),
'database': config.get('database'),
'charset': 'utf8mb4',
'autocommit': True
}
def search_items(query):
"""Search items in database"""
print(f"# DEBUG: search_items called with '{query}'", file=sys.stderr)
if len(query.strip()) < 2:
print("# DEBUG: Query too short", file=sys.stderr)
return []
try:
print("# DEBUG: Loading config...", file=sys.stderr)
config = load_db_config()
print(f"# DEBUG: Connecting to DB: {config['host']}", file=sys.stderr)
conn = pymysql.connect(**config)
cursor = conn.cursor(pymysql.cursors.DictCursor)
print("# DEBUG: Connected successfully", file=sys.stderr)
sql = """
SELECT id, number, name, active
FROM items
WHERE (number LIKE %s OR name LIKE %s)
AND active = 1
ORDER BY
CASE
WHEN number LIKE %s THEN 1
WHEN name LIKE %s THEN 2
ELSE 3
END,
name ASC, number ASC
LIMIT 20
"""
search_param = f"%{query}%"
search_param_start = f"{query}%"
print(f"# DEBUG: SQL params: {search_param}", file=sys.stderr)
cursor.execute(sql, (search_param, search_param, search_param_start, search_param_start))
results = cursor.fetchall()
print(f"# DEBUG: Raw SQL results: {len(results)} rows", file=sys.stderr)
# Test: try without active filter
test_sql = "SELECT COUNT(*) as total FROM items WHERE (number LIKE %s OR name LIKE %s)"
cursor.execute(test_sql, (search_param, search_param))
total = cursor.fetchone()
print(f"# DEBUG: Total matches (any active): {total}", file=sys.stderr)
items = []
for row in results:
status = ' || aktiv' if row['active'] else ' || inaktiv'
items.append({
'id': row['id'],
'value': row['number'],
'label': f"{row['name']} ({row['number']}{status})",
'number': row['number'],
'name': row['name'],
'active': row['active']
})
cursor.close()
conn.close()
return items
except Exception as e:
# Return empty array on error - let PHP fallback handle it
return []
if __name__ == '__main__':
print("# DEBUG: Script started", file=sys.stderr)
print(f"# DEBUG: Args: {sys.argv}", file=sys.stderr)
if len(sys.argv) != 2:
print("# DEBUG: Wrong number of args", file=sys.stderr)
print("[]")
sys.exit(1)
search_query = sys.argv[1]
print(f"# DEBUG: Searching for '{search_query}'", file=sys.stderr)
try:
results = search_items(search_query)
print(f"# DEBUG: Got results: {results}", file=sys.stderr)
print(json.dumps(results))
except Exception as e:
print(f"# DEBUG: Exception: {e}", file=sys.stderr)
import traceback
traceback.print_exc(file=sys.stderr)
print("[]")