From dc11a23e05d5aae5adf42adbd5e0492bcf499dcd Mon Sep 17 00:00:00 2001 From: Adabriand Furtado Date: Thu, 22 Oct 2015 11:32:20 -0300 Subject: [PATCH] Versão inicial do Validador. --- .gitignore | 9 +++++++++ inicial.txt | 1 - main.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pyutil.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 3 +++ settings_local.py.tmpl | 11 +++++++++++ validador.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ view/assets/css/main.css | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ view/assets/fonts/Helvetica.otf | Bin 0 -> 16500 bytes view/assets/fonts/TitilliumWeb-Black.ttf | Bin 0 -> 49356 bytes view/assets/fonts/TitilliumWeb-Bold.ttf | Bin 0 -> 59908 bytes view/assets/fonts/TitilliumWeb-BoldItalic.ttf | Bin 0 -> 69796 bytes view/assets/fonts/TitilliumWeb-ExtraLight.ttf | Bin 0 -> 63124 bytes view/assets/fonts/TitilliumWeb-ExtraLightItalic.ttf | Bin 0 -> 67788 bytes view/assets/fonts/TitilliumWeb-Italic.ttf | Bin 0 -> 72416 bytes view/assets/fonts/TitilliumWeb-Light.ttf | Bin 0 -> 64032 bytes view/assets/fonts/TitilliumWeb-LightItalic.ttf | Bin 0 -> 71720 bytes view/assets/fonts/TitilliumWeb-Regular.ttf | Bin 0 -> 63752 bytes view/assets/fonts/TitilliumWeb-SemiBold.ttf | Bin 0 -> 63044 bytes view/assets/fonts/TitilliumWeb-SemiBoldItalic.ttf | Bin 0 -> 71812 bytes view/img/finish.svg | 17 +++++++++++++++++ view/img/no.png | Bin 0 -> 6262 bytes view/img/skip.svg | 17 +++++++++++++++++ view/img/thumbnail.png | Bin 0 -> 35402 bytes view/template.html | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ view/videos/ENSINADO_AVATAR.webm | Bin 0 -> 166517 bytes view/videos/ENSINADO_REF.webm | Bin 0 -> 723932 bytes view/videos/ENTANTO_AVATAR.webm | Bin 0 -> 124907 bytes view/videos/ENTANTO_REF.webm | Bin 0 -> 447557 bytes view/videos/ENTENDIDO_AVATAR.webm | Bin 0 -> 190993 bytes view/videos/ENTENDIDO_REF.webm | Bin 0 -> 432617 bytes 31 files changed, 516 insertions(+), 1 deletion(-) create mode 100644 .gitignore delete mode 100644 inicial.txt create mode 100644 main.py create mode 100644 pyutil.py create mode 100644 requirements.txt create mode 100644 settings_local.py.tmpl create mode 100644 validador.py create mode 100755 view/assets/css/main.css create mode 100755 view/assets/fonts/Helvetica.otf create mode 100755 view/assets/fonts/TitilliumWeb-Black.ttf create mode 100755 view/assets/fonts/TitilliumWeb-Bold.ttf create mode 100755 view/assets/fonts/TitilliumWeb-BoldItalic.ttf create mode 100755 view/assets/fonts/TitilliumWeb-ExtraLight.ttf create mode 100755 view/assets/fonts/TitilliumWeb-ExtraLightItalic.ttf create mode 100755 view/assets/fonts/TitilliumWeb-Italic.ttf create mode 100755 view/assets/fonts/TitilliumWeb-Light.ttf create mode 100755 view/assets/fonts/TitilliumWeb-LightItalic.ttf create mode 100755 view/assets/fonts/TitilliumWeb-Regular.ttf create mode 100755 view/assets/fonts/TitilliumWeb-SemiBold.ttf create mode 100755 view/assets/fonts/TitilliumWeb-SemiBoldItalic.ttf create mode 100755 view/img/finish.svg create mode 100644 view/img/no.png create mode 100755 view/img/skip.svg create mode 100644 view/img/thumbnail.png create mode 100755 view/template.html create mode 100644 view/videos/ENSINADO_AVATAR.webm create mode 100644 view/videos/ENSINADO_REF.webm create mode 100644 view/videos/ENTANTO_AVATAR.webm create mode 100644 view/videos/ENTANTO_REF.webm create mode 100644 view/videos/ENTENDIDO_AVATAR.webm create mode 100644 view/videos/ENTENDIDO_REF.webm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c5ba00 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.* +*~ +!.gitignore +!.gitempty +*.log +*.pyc +settings_local.py +env/ +tmp/ diff --git a/inicial.txt b/inicial.txt deleted file mode 100644 index b6193d9..0000000 --- a/inicial.txt +++ /dev/null @@ -1 +0,0 @@ -Repositorio validador_sinais Criado diff --git a/main.py b/main.py new file mode 100644 index 0000000..9c2f021 --- /dev/null +++ b/main.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +from flask import Flask, send_from_directory +from flask.ext.cors import CORS +from jinja2 import Environment, PackageLoader +from validador import Validador +import os +import pyutil + +app = Flask(__name__) +CORS(app) +controller = None + +@app.route("/") +def send_static_files(path): + root_dir = os.path.abspath(os.path.dirname(__file__)) + file_dir = os.path.join(root_dir, "view") + return send_from_directory(file_dir, path) + +@app.route("/update_project") +def update_project(): + try: + return controller.update_project() + except: + pyutil.print_stack_trace() + raise + +@app.route("/create_project") +def create_project(): + try: + return controller.create_project() + except: + pyutil.print_stack_trace() + raise + +@app.route("/finish_task", methods=["POST"]) +def finish_task(): + # TODO read - request.data['upload_session_id'] e request.data['sign_name'] + return + +def read_settings(app): + here = os.path.abspath(__file__) + config_path = os.path.join(os.path.dirname(here), 'settings_local.py') + if os.path.exists(config_path): + app.config.from_pyfile(config_path) + app.config['HOST_ENDPOINT'] = "http://" + app.config['SERVER_HOST'] + ":" + str(app.config['SERVER_PORT']) + +def setup_controller(): + global controller + read_settings(app) + env = Environment(loader=PackageLoader('main', 'view')) + controller = Validador(app.config, env) + +def run(): + setup_controller() + app.run(port=app.config['SERVER_PORT']) + +if __name__ == '__main__': + try: + run() + except: + pyutil.print_stack_trace() + raise diff --git a/pyutil.py b/pyutil.py new file mode 100644 index 0000000..d8598d1 --- /dev/null +++ b/pyutil.py @@ -0,0 +1,68 @@ +# -*- coding: UTF-8 -*- + +import datetime +import logging +import os +import shutil +import sys + +# @def funcao para obter data e hora atual do sistema +# @param string formato de data e hora +# @return string retorna data e hora do sistema no momento da chamada +def getTimeStamp(date_fmt="%Y-%m-%d %H:%M:%S.%f"): + if ("%f" in date_fmt): + # [:-3] remove 3 casas decimais dos milisegundos (ms) + return datetime.datetime.now().strftime(date_fmt)[:-3] + else: + return datetime.datetime.now().strftime(date_fmt) + +# @def funcao para gravar log dos eventos em arquivo +# @param string mensagem a ser salva +# @param int indice do tipo de log 0: apenas print, 1: debug, 2: info, 3: warn, 4: error, 5: critical +# @param string caminho completo do arquivo de logs +# @param string formato de tempo utilizado +# @return none +def log(msg="", log_level=2, log_file="events.log"): + dict_level = { + 0: ["Print", None, None], + 1: ["DEBUG", logging.DEBUG, logging.debug], + 2: ["INFO", logging.INFO, logging.info], + 3: ["WARNING", logging.WARN, logging.warn], + 4: ["ERROR", logging.ERROR, logging.error], + 5: ["CRITICAL", logging.CRITICAL, logging.critical] + } + # log_format = "[%(asctime)s.%(msecs).03d] %(levelname)s: : %(message)s" + log_format = "[%(asctime)s.%(msecs).03d] %(levelname)s: %(message)s" + date_fmt = "%Y-%m-%d %H:%M:%S" + logging.basicConfig(filename=log_file, datefmt=date_fmt, format=log_format, level=dict_level[log_level][1]) + logging.Formatter(fmt="%(asctime)s", datefmt=date_fmt) + log_level %= len(dict_level) + write_mode = dict_level[log_level][2] + print("[%s] %s: %s" % (getTimeStamp(), dict_level[log_level][0], msg)) + if (write_mode != None): + write_mode(msg) + return + +# @def funcao para exibir excecao +# @param string deve ser passado: "__file__" para identificar em qual modulo ocorreu a excecao +# @return int retorna 1 +def print_stack_trace(): + error = "\n File name: %s\n Function name: %s\n Line code: %s\n Type exception: %s\n Message: %s" % ( + os.path.basename(sys.exc_info()[2].tb_frame.f_code.co_filename), + sys.exc_info()[2].tb_frame.f_code.co_name, + sys.exc_info()[2].tb_lineno, + sys.exc_info()[0].__name__, + sys.exc_info()[1] + ) + log(error, 4) + return 1 + +def get_date_now(): + return datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S') + +def is_int(string): + try: + int(string) + return True + except ValueError: + return False diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..28647d4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +Flask==0.9 +pybossa-client +flask-cors \ No newline at end of file diff --git a/settings_local.py.tmpl b/settings_local.py.tmpl new file mode 100644 index 0000000..9621e29 --- /dev/null +++ b/settings_local.py.tmpl @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Corretor Server Configuration +SERVER_HOST = "localhost" +SERVER_PORT = 8001 + +# PyBossa Configuration +PYBOSSA_APP_NAME = "Validador de Sinais" +PYBOSSA_APP_SHORT_NAME = "validador_sinais" +PYBOSSA_APP_DESCRIPTION = "Esse projeto possibilitará que especialistas aprovem sinais gerados pela comunidade." +PYBOSSA_ENDPOINT = "http://localhost:5000" +PYBOSSA_API_KEY = "my-api-key" \ No newline at end of file diff --git a/validador.py b/validador.py new file mode 100644 index 0000000..4067e47 --- /dev/null +++ b/validador.py @@ -0,0 +1,62 @@ +from flask import request, make_response +from werkzeug import secure_filename +import pbclient +import os +import pyutil + +class Validador: + + def __init__(self, configuration, template_env): + self.config = configuration + self.env = template_env + self.__setup_pb_client() + + def __setup_pb_client(self): + pbclient.set('endpoint', self.config['PYBOSSA_ENDPOINT']) + pbclient.set('api_key', self.config['PYBOSSA_API_KEY']) + + def __find_project(self, app_short_name): + projects = pbclient.find_project(short_name=app_short_name) + return projects[0] if len(projects) > 0 else None + + def __setup_project(self, project): + self.__create_tasks(project) + self.__update_project_info(project) + + def __create_tasks(self, project): + test_signs = ["ENSINADO", "ENTANTO", "ENTENDIDO"] + for sign in test_signs: + task = dict(sign_name=sign, submission_date=pyutil.get_date_now()) + pbclient.create_task(project.id, task) + + def __update_project_info(self, project): + template = self.env.get_template('template.html') + project.info['task_presenter'] = template.render(server=self.config['HOST_ENDPOINT'], app_shortname=self.config['PYBOSSA_APP_SHORT_NAME']) + project.info['thumbnail'] = self.config['HOST_ENDPOINT'] + "/img/thumbnail.png" + project.info['sched'] = "incremental" + project.allow_anonymous_contributors = False + pbclient.update_project(project) + + def create_project(self): + app_short_name = self.config['PYBOSSA_APP_SHORT_NAME'] + project = self.__find_project(app_short_name) + result_msg = "" + if (project): + result_msg = "The project " + app_short_name + " was already created." + else: + project = pbclient.create_project(self.config['PYBOSSA_APP_NAME'], app_short_name, self.config['PYBOSSA_APP_DESCRIPTION']) + if (project): + self.__setup_project(project) + result_msg = "The project " + app_short_name + " was created." + else: + result_msg = "The project " + app_short_name + " couldn't be created. Check the server log for details." + pyutil.log(result_msg) + return result_msg + + def update_project(self): + app_short_name = self.config['PYBOSSA_APP_SHORT_NAME'] + project = self.__find_project(app_short_name) + self.__update_project_info(project) + result_msg = "The project " + app_short_name + " was updated." + pyutil.log(result_msg) + return result_msg diff --git a/view/assets/css/main.css b/view/assets/css/main.css new file mode 100755 index 0000000..b7548b9 --- /dev/null +++ b/view/assets/css/main.css @@ -0,0 +1,96 @@ +@font-face { + font-family: 'Titillium Web'; + src: url('../fonts/TitilliumWeb-SemiBold.ttf') format('truetype'); +} + +.video-body { + height: 50%; + width: 85%; +} + +.video-container { + padding-left: 40px; + padding-right: 0px; +} + +.row { + margin-left: 0%; + margin-right: 0%; +} + +/* Sombras */ +.line-separator, .btn-default { + box-shadow: 2px 2px 2px rgba(215, 217, 221, 1.0); + -webkit-box-shadow: 2px 2px 2px rgba(215, 217, 221, 1.0); + -moz-box-shadow: 2px 2px 2px rgba(215, 217, 221, 1.0); +} + +/* Fontes */ +.btn-default, .finish-task-button, h1, + h2, h3, h4, h5, h6 { + font-family: 'Titillium Web', sans-serif; +} + +/* Header */ +#validador-header { + padding: 1px; + background: rgba(255, 255, 255, 1.0); +} + +/* Body */ +.body-container { + background: rgba(236, 238, 242, 1.0); + padding-bottom: 10px; +} + +/* Linha */ +.line-separator { + height: 2px; + width: 100%; + background-color: rgba(145, 200, 206, 1.0); +} + +/* Texto */ +h1, h2, h3, h4, h5, h6 { + color: rgba(144, 164, 174, 1.0); +} + +h6 { + font-size: 20px; +} + +.btn-default { + background-color: rgba(94, 199, 189, 1.0); +} + +.btn-default { + color: rgba(255, 255, 255, 1.0); +} + +.icon { + width: 50px; + height: 50px; +} + +#finish-task-container { + padding-top: 40px; + padding-right: 40px; +} + +.finish-task-button { + float: right; + padding-bottom: 0px; + padding-left: 25px; + color: rgba(94, 199, 189, 1.0); +} + +.enabled-button:hover { + cursor: pointer; + filter: alpha(opacity = 50); + opacity: 0.5; +} + +.disabled-button { + filter: alpha(opacity = 50); + opacity: 0.5; +} diff --git a/view/assets/fonts/Helvetica.otf b/view/assets/fonts/Helvetica.otf new file mode 100755 index 0000000..9b1dc86 Binary files /dev/null and b/view/assets/fonts/Helvetica.otf differ diff --git a/view/assets/fonts/TitilliumWeb-Black.ttf b/view/assets/fonts/TitilliumWeb-Black.ttf new file mode 100755 index 0000000..fc5c4b5 Binary files /dev/null and b/view/assets/fonts/TitilliumWeb-Black.ttf differ diff --git a/view/assets/fonts/TitilliumWeb-Bold.ttf b/view/assets/fonts/TitilliumWeb-Bold.ttf new file mode 100755 index 0000000..0af0fe7 Binary files /dev/null and b/view/assets/fonts/TitilliumWeb-Bold.ttf differ diff --git a/view/assets/fonts/TitilliumWeb-BoldItalic.ttf b/view/assets/fonts/TitilliumWeb-BoldItalic.ttf new file mode 100755 index 0000000..77425ea Binary files /dev/null and b/view/assets/fonts/TitilliumWeb-BoldItalic.ttf differ diff --git a/view/assets/fonts/TitilliumWeb-ExtraLight.ttf b/view/assets/fonts/TitilliumWeb-ExtraLight.ttf new file mode 100755 index 0000000..2b506ef Binary files /dev/null and b/view/assets/fonts/TitilliumWeb-ExtraLight.ttf differ diff --git a/view/assets/fonts/TitilliumWeb-ExtraLightItalic.ttf b/view/assets/fonts/TitilliumWeb-ExtraLightItalic.ttf new file mode 100755 index 0000000..c1be5ba Binary files /dev/null and b/view/assets/fonts/TitilliumWeb-ExtraLightItalic.ttf differ diff --git a/view/assets/fonts/TitilliumWeb-Italic.ttf b/view/assets/fonts/TitilliumWeb-Italic.ttf new file mode 100755 index 0000000..42f2c10 Binary files /dev/null and b/view/assets/fonts/TitilliumWeb-Italic.ttf differ diff --git a/view/assets/fonts/TitilliumWeb-Light.ttf b/view/assets/fonts/TitilliumWeb-Light.ttf new file mode 100755 index 0000000..ca67971 Binary files /dev/null and b/view/assets/fonts/TitilliumWeb-Light.ttf differ diff --git a/view/assets/fonts/TitilliumWeb-LightItalic.ttf b/view/assets/fonts/TitilliumWeb-LightItalic.ttf new file mode 100755 index 0000000..2ea724f Binary files /dev/null and b/view/assets/fonts/TitilliumWeb-LightItalic.ttf differ diff --git a/view/assets/fonts/TitilliumWeb-Regular.ttf b/view/assets/fonts/TitilliumWeb-Regular.ttf new file mode 100755 index 0000000..6da8219 Binary files /dev/null and b/view/assets/fonts/TitilliumWeb-Regular.ttf differ diff --git a/view/assets/fonts/TitilliumWeb-SemiBold.ttf b/view/assets/fonts/TitilliumWeb-SemiBold.ttf new file mode 100755 index 0000000..dfdcdbe Binary files /dev/null and b/view/assets/fonts/TitilliumWeb-SemiBold.ttf differ diff --git a/view/assets/fonts/TitilliumWeb-SemiBoldItalic.ttf b/view/assets/fonts/TitilliumWeb-SemiBoldItalic.ttf new file mode 100755 index 0000000..b68a669 Binary files /dev/null and b/view/assets/fonts/TitilliumWeb-SemiBoldItalic.ttf differ diff --git a/view/img/finish.svg b/view/img/finish.svg new file mode 100755 index 0000000..f6d4e0c --- /dev/null +++ b/view/img/finish.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/view/img/no.png b/view/img/no.png new file mode 100644 index 0000000..3879b2f Binary files /dev/null and b/view/img/no.png differ diff --git a/view/img/skip.svg b/view/img/skip.svg new file mode 100755 index 0000000..2d006dc --- /dev/null +++ b/view/img/skip.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/view/img/thumbnail.png b/view/img/thumbnail.png new file mode 100644 index 0000000..ead10bc Binary files /dev/null and b/view/img/thumbnail.png differ diff --git a/view/template.html b/view/template.html new file mode 100755 index 0000000..b96818c --- /dev/null +++ b/view/template.html @@ -0,0 +1,171 @@ + + +
+ + +
+ +
+
+

+ A animação do sinal "" está correta? +

+
+
+
+
+
+
+ ANIMAÇÃO "": +
+
+
+ +
+
+
+
+
+ VÍDEO DE REFERÊNCIA “”: +
+
+
+ +
+
+
+ SIM +
+
+ NÃO +
+
+ PULAR +
+
+
+ +
+
+ + diff --git a/view/videos/ENSINADO_AVATAR.webm b/view/videos/ENSINADO_AVATAR.webm new file mode 100644 index 0000000..daa1f9d Binary files /dev/null and b/view/videos/ENSINADO_AVATAR.webm differ diff --git a/view/videos/ENSINADO_REF.webm b/view/videos/ENSINADO_REF.webm new file mode 100644 index 0000000..5a6c143 Binary files /dev/null and b/view/videos/ENSINADO_REF.webm differ diff --git a/view/videos/ENTANTO_AVATAR.webm b/view/videos/ENTANTO_AVATAR.webm new file mode 100644 index 0000000..d80339e Binary files /dev/null and b/view/videos/ENTANTO_AVATAR.webm differ diff --git a/view/videos/ENTANTO_REF.webm b/view/videos/ENTANTO_REF.webm new file mode 100644 index 0000000..b9ac680 Binary files /dev/null and b/view/videos/ENTANTO_REF.webm differ diff --git a/view/videos/ENTENDIDO_AVATAR.webm b/view/videos/ENTENDIDO_AVATAR.webm new file mode 100644 index 0000000..fd64277 Binary files /dev/null and b/view/videos/ENTENDIDO_AVATAR.webm differ diff --git a/view/videos/ENTENDIDO_REF.webm b/view/videos/ENTENDIDO_REF.webm new file mode 100644 index 0000000..b5bf46e Binary files /dev/null and b/view/videos/ENTENDIDO_REF.webm differ -- libgit2 0.21.2