Commit 9e06b9fd5cff9bf0a9edb7765db03bf86d707362

Authored by Erickson Silva
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