ff68c1111f
* Improved search script
88 lines
3.3 KiB
Python
Executable File
88 lines
3.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
# You can test it with:
|
|
# curl --request POST --data string=foobar\&what=language http://localhost:4000
|
|
|
|
import wsgiref.simple_server as server
|
|
import urllib.parse
|
|
|
|
# PostgreSQL interface
|
|
import psycopg2
|
|
|
|
# HTML templates http://www.yattag.org/
|
|
from yattag import Doc
|
|
|
|
PORT = 4000
|
|
#REDIRECTION_URL = "file:///home/stephane/src/Language-tags/GaBuZoMeu/registry-html" # Firefox does not accept a redirect to a file
|
|
REDIRECTION_URL = "https://www.langtag.net/registries/registry-html"
|
|
|
|
def pack(start_response, status, data, headers = []):
|
|
datae = data.encode() # Always encode to UTF-8
|
|
response_headers = [("Content-type", "text/plain; charset=UTF-8"), # TODO allows the type HTML
|
|
("Content-Length", str(len(datae)))]
|
|
if headers != []:
|
|
for header in headers:
|
|
response_headers.append(header)
|
|
start_response(status, response_headers)
|
|
return [datae]
|
|
|
|
def application(environ, start_response):
|
|
if environ["REQUEST_METHOD"] != "POST":
|
|
status = "405 Method unavailable"
|
|
output = "Unsupported HTTP method \"%s\"\r\n" % environ["REQUEST_METHOD"]
|
|
return pack(start_response, status, output)
|
|
try:
|
|
body_size = int(environ.get("CONTENT_LENGTH", 0))
|
|
except (ValueError):
|
|
body_size = 0
|
|
body = environ["wsgi.input"].read(body_size)
|
|
query = urllib.parse.parse_qsl(body.decode())
|
|
form = {}
|
|
headers = []
|
|
for q in query:
|
|
form[q[0]] = q[1]
|
|
for mandatory in ["string", "what"]:
|
|
if mandatory not in form:
|
|
status = "400 Invalid request"
|
|
output = "Missing \"%s\" in request\r\n" % mandatory
|
|
return pack(start_response, status, output)
|
|
if form["what"] == "language":
|
|
sql = "SELECT * FROM Languages WHERE code = %s"
|
|
term = form["string"].lower()
|
|
elif form["what"] == "script":
|
|
sql = "SELECT * FROM Scripts WHERE code = %s"
|
|
term = form["string"].capitalize()
|
|
else:
|
|
status = "400 Invalid request"
|
|
output = "Unknown search category \"%s\"\r\n" % form["what"]
|
|
return pack(start_response, status, output)
|
|
cursor.execute(sql, (term, ))
|
|
mytuple = cursor.fetchone()
|
|
status = "200 OK"
|
|
if mytuple is not None:
|
|
status = "308 Redirect"
|
|
url = "%s/%s/%s.html" % (REDIRECTION_URL, form["what"], mytuple[1])
|
|
headers.append(("Location", url))
|
|
output = "Redirect to %s\r\n" % (url)
|
|
else:
|
|
if form["what"] == "language":
|
|
sql = "SELECT * FROM Languages,Descriptions_Languages,Descriptions WHERE Descriptions_Languages.description = Descriptions.id AND Descriptions_Languages.lang = Languages.code AND position(%s in lower(Descriptions.description)) > 0;"
|
|
elif form["what"] == "script":
|
|
raise "TODO not implemented"
|
|
cursor.execute(sql, (term, ))
|
|
found = False
|
|
output = ""
|
|
for tuple in cursor.fetchall():
|
|
output += "TODO %s\r\n" % str(tuple) # TODO make it a HTML list
|
|
found = True
|
|
if not found:
|
|
output = "\"%s\" not found\r\n" % term
|
|
return pack(start_response, status, output, headers)
|
|
|
|
if __name__ == "__main__":
|
|
conn = psycopg2.connect("dbname=lsr")
|
|
cursor = conn.cursor()
|
|
httpd = server.make_server("", PORT, application)
|
|
print("Listening on port %s" % PORT)
|
|
httpd.serve_forever()
|