Commit 9e06b9fd5cff9bf0a9edb7765db03bf86d707362
1 parent
62051eda
Exists in
devel
[TranslationServer] Adiciona endpoint para versão do dict e implementa nova form…
…a para obter a lista de sinais
Showing
1 changed file
with
45 additions
and
10 deletions
Show diff stats
src/TranslationServer.py
| @@ -5,14 +5,15 @@ from flask import Flask, request, abort, send_from_directory | @@ -5,14 +5,15 @@ from flask import Flask, request, abort, send_from_directory | ||
| 5 | from flask.ext.cors import CORS | 5 | from flask.ext.cors import CORS |
| 6 | from functools import wraps | 6 | from functools import wraps |
| 7 | from PortGlosa import traduzir | 7 | from PortGlosa import traduzir |
| 8 | -from subprocess import check_output | 8 | +from subprocess import check_output, Popen |
| 9 | from threading import Lock | 9 | from threading import Lock |
| 10 | from time import sleep | 10 | from time import sleep |
| 11 | from logging.handlers import RotatingFileHandler | 11 | from logging.handlers import RotatingFileHandler |
| 12 | -import os, argparse, thread, logging, sys | 12 | +import Trie, os, argparse, json, thread, logging, sys |
| 13 | 13 | ||
| 14 | MySQLdb=None | 14 | MySQLdb=None |
| 15 | RUN_MODE=None | 15 | RUN_MODE=None |
| 16 | +DICT_VERSION=None | ||
| 16 | BUNDLES_PATH=None | 17 | BUNDLES_PATH=None |
| 17 | BUNDLES_LIST={} | 18 | BUNDLES_LIST={} |
| 18 | conn=None | 19 | conn=None |
| @@ -39,6 +40,7 @@ def dict_mode(): | @@ -39,6 +40,7 @@ def dict_mode(): | ||
| 39 | STANDALONE_SIGNS_PATH=os.path.join(SIGNS_PATH, "STANDALONE") | 40 | STANDALONE_SIGNS_PATH=os.path.join(SIGNS_PATH, "STANDALONE") |
| 40 | WEBGL_SIGNS_PATH=os.path.join(SIGNS_PATH, "WEBGL") | 41 | WEBGL_SIGNS_PATH=os.path.join(SIGNS_PATH, "WEBGL") |
| 41 | BUNDLES_PATH={"IOS":IOS_SIGNS_PATH, "ANDROID":ANDROID_SIGNS_PATH, "STANDALONE":STANDALONE_SIGNS_PATH, "WEBGL":WEBGL_SIGNS_PATH} | 42 | BUNDLES_PATH={"IOS":IOS_SIGNS_PATH, "ANDROID":ANDROID_SIGNS_PATH, "STANDALONE":STANDALONE_SIGNS_PATH, "WEBGL":WEBGL_SIGNS_PATH} |
| 43 | + check_version() | ||
| 42 | list_bundles() | 44 | list_bundles() |
| 43 | 45 | ||
| 44 | def connect_database(): | 46 | def connect_database(): |
| @@ -72,6 +74,10 @@ def logger(): | @@ -72,6 +74,10 @@ def logger(): | ||
| 72 | log.setLevel(logging.DEBUG) | 74 | log.setLevel(logging.DEBUG) |
| 73 | log.addHandler(handler) | 75 | log.addHandler(handler) |
| 74 | 76 | ||
| 77 | +def check_version(): | ||
| 78 | + global DICT_VERSION | ||
| 79 | + DICT_VERSION = check_output(["aptitude", "search", "dicionario-vlibras", "-F", "%V"]) | ||
| 80 | + | ||
| 75 | def init_mode(args): | 81 | def init_mode(args): |
| 76 | global RUN_MODE | 82 | global RUN_MODE |
| 77 | if args.logfile: logger() | 83 | if args.logfile: logger() |
| @@ -88,12 +94,14 @@ def init_mode(args): | @@ -88,12 +94,14 @@ def init_mode(args): | ||
| 88 | def list_bundles(): | 94 | def list_bundles(): |
| 89 | global BUNDLES_LIST | 95 | global BUNDLES_LIST |
| 90 | states = ["AC", "AL", "AP", "AM", "BA", "CE", "DF", "ES", "GO", "MA", "MT", "MS", "MG", "PA", "PB", "PR", "PE", "PI", "RJ", "RN", "RS", "RO", "RR", "SC", "SP", "SE", "TO"] | 96 | states = ["AC", "AL", "AP", "AM", "BA", "CE", "DF", "ES", "GO", "MA", "MT", "MS", "MG", "PA", "PB", "PR", "PE", "PI", "RJ", "RN", "RS", "RO", "RR", "SC", "SP", "SE", "TO"] |
| 91 | - BUNDLES_LIST["DEFAULT"] = set(list_files(BUNDLES_PATH["ANDROID"])) | ||
| 92 | - for state in states: | ||
| 93 | - try: | ||
| 94 | - BUNDLES_LIST[state] = set(os.listdir(os.path.join(BUNDLES_PATH["ANDROID"], state))) | ||
| 95 | - except OSError: | ||
| 96 | - BUNDLES_LIST[state] = set([]) | 97 | + BUNDLES_LIST["DEFAULT"] = check_platform_files() |
| 98 | + for platform, path in BUNDLES_PATH.iteritems(): | ||
| 99 | + BUNDLES_LIST[platform] = {} | ||
| 100 | + for state in states: | ||
| 101 | + try: | ||
| 102 | + BUNDLES_LIST[platform].update({state:set(os.listdir(os.path.join(path, state)))}) | ||
| 103 | + except OSError: | ||
| 104 | + BUNDLES_LIST[platform].update({state:set([])}) | ||
| 97 | 105 | ||
| 98 | def list_files(path): | 106 | def list_files(path): |
| 99 | files = [] | 107 | files = [] |
| @@ -103,6 +111,15 @@ def list_files(path): | @@ -103,6 +111,15 @@ def list_files(path): | ||
| 103 | files.append(fname) | 111 | files.append(fname) |
| 104 | return files | 112 | return files |
| 105 | 113 | ||
| 114 | +def check_platform_files(): | ||
| 115 | + android = set(list_files(BUNDLES_PATH["ANDROID"])) | ||
| 116 | + ios = set(list_files(BUNDLES_PATH["IOS"])) | ||
| 117 | + webgl = set(list_files(BUNDLES_PATH["WEBGL"])) | ||
| 118 | + standalone = set(list_files(BUNDLES_PATH["STANDALONE"])) | ||
| 119 | + if android == ios and ios == webgl and webgl == standalone: | ||
| 120 | + return standalone | ||
| 121 | + raise RuntimeError("Inconsistent signs. Check files.") | ||
| 122 | + | ||
| 106 | def check_database(): | 123 | def check_database(): |
| 107 | cursor = conn.cursor() | 124 | cursor = conn.cursor() |
| 108 | cursor.execute('CREATE DATABASE IF NOT EXISTS signsdb;') | 125 | cursor.execute('CREATE DATABASE IF NOT EXISTS signsdb;') |
| @@ -251,9 +268,27 @@ def load_statistics_page(): | @@ -251,9 +268,27 @@ def load_statistics_page(): | ||
| 251 | 268 | ||
| 252 | @app.route("/update", methods=['GET']) | 269 | @app.route("/update", methods=['GET']) |
| 253 | def update_list_bundles(): | 270 | def update_list_bundles(): |
| 271 | + try: | ||
| 272 | + password = request.args.get('password').encode('utf-8') | ||
| 273 | + except AttributeError: | ||
| 274 | + return "Password not provided", 401 | ||
| 275 | + | ||
| 276 | + Popen('sudo -S <<< '+password+' apt-get update > /dev/null 2>&1', shell=True, stdin=None, stdout=None, stderr=None, executable="/bin/bash").wait() | ||
| 277 | + check_version() | ||
| 254 | list_bundles() | 278 | list_bundles() |
| 255 | return "Successfully updated list.", 200 | 279 | return "Successfully updated list.", 200 |
| 256 | 280 | ||
| 281 | +@app.route("/version", methods=['GET']) | ||
| 282 | +def get_version(): | ||
| 283 | + return DICT_VERSION, 200 | ||
| 284 | + | ||
| 285 | +@app.route("/signs", methods=['GET']) | ||
| 286 | +def get_signs_list(): | ||
| 287 | + signs = list(BUNDLES_LIST["DEFAULT"]) | ||
| 288 | + #return json.dumps(signs), 200 | ||
| 289 | + trie = Trie.gen(signs) | ||
| 290 | + return json.dumps(trie), 200 | ||
| 291 | + | ||
| 257 | @app.route("/<platform>/<sign>", methods=['GET']) | 292 | @app.route("/<platform>/<sign>", methods=['GET']) |
| 258 | @check_run_mode | 293 | @check_run_mode |
| 259 | def get_sign(platform, sign): | 294 | def get_sign(platform, sign): |
| @@ -273,9 +308,9 @@ def get_sign_state(platform, state, sign): | @@ -273,9 +308,9 @@ def get_sign_state(platform, state, sign): | ||
| 273 | sign = sign.encode("UTF-8") | 308 | sign = sign.encode("UTF-8") |
| 274 | state = state.encode("UTF-8") | 309 | state = state.encode("UTF-8") |
| 275 | if " " in sign or platform not in BUNDLES_PATH: abort(400) | 310 | if " " in sign or platform not in BUNDLES_PATH: abort(400) |
| 276 | - file_exists = sign in BUNDLES_LIST[state] | ||
| 277 | - thread.start_new_thread(update_database_statistic, (sign, platform, file_exists)) | 311 | + file_exists = sign in BUNDLES_LIST[platform][state] |
| 278 | if file_exists: | 312 | if file_exists: |
| 313 | + thread.start_new_thread(update_database_statistic, (sign, platform, file_exists)) | ||
| 279 | return send_from_directory(os.path.join(BUNDLES_PATH[platform], state), sign) | 314 | return send_from_directory(os.path.join(BUNDLES_PATH[platform], state), sign) |
| 280 | return get_sign(platform.decode("UTF-8"), sign.decode("UTF-8")) | 315 | return get_sign(platform.decode("UTF-8"), sign.decode("UTF-8")) |
| 281 | 316 |