Commit 49c9936f15801ec4dd0fbe1864bed33856546fb6
Exists in
master
and in
1 other branch
Merge remote-tracking branch 'origin/dynamic'
Conflicts: .gitignore
Showing
9 changed files
with
123 additions
and
61 deletions
Show diff stats
.gitignore
1 | +.* | |
2 | +!*.gitignore | |
3 | +!*.gitempty | |
4 | +*~ | |
5 | +*.log | |
6 | +*.pyc | |
7 | +corretor.conf | |
8 | +corretor.wsgi | |
9 | +settings_local.py | |
10 | +env/ | |
11 | +videos/ | |
12 | +tmp/ | |
13 | +uploads/ | |
14 | + | |
1 | 15 | *.egg-info |
2 | 16 | *.tox |
3 | 17 | .*.swp |
4 | -env/ | |
5 | -events.log | |
6 | -*.pyc | |
7 | 18 | *.db |
8 | 19 | settings_local.py |
9 | -env/ | |
10 | 20 | doc/_build |
11 | 21 | *.un~ |
12 | 22 | *.wsgi | ... | ... |
requirements.txt
settings_local.py
1 | 1 | # -*- coding: utf-8 -*- |
2 | -# Corretor Server Configuration | |
3 | -SERVER_HOST = "0.0.0.0" | |
2 | +# WikiLibras Server Configuration | |
3 | +SERVER_HOST = "150.165.204.35" | |
4 | 4 | SERVER_PORT = 8003 |
5 | 5 | AGREEMENT_NUMBER = 2 |
6 | -API_HOST = "http://0.0.0.0:5001" | |
6 | +API_HOST = "http://150.165.204.35:201" | |
7 | +API_DB_HOST = "http://150.165.204.35:200" | |
8 | +UPLOAD_SIGN_HOST = "http://150.165.204.35:200/addsinal" | |
9 | +HOMEPAGE_URL = "http://wikilibras.lavid.ufpb.br" | |
7 | 10 | |
8 | 11 | # Apache Configuration |
9 | -APACHE_HOST = False | |
12 | +APACHE_HOST = True | |
10 | 13 | APACHE_HOST_ENDPOINT = "/wikilibras-backend" |
11 | 14 | APACHE_STATIC_FILES_ENDPOINT = "/wikilibras" |
12 | 15 | |
13 | 16 | # PyBossa Configuration |
14 | 17 | PYBOSSA_APP_NAME = "WikiLibras" |
15 | -PYBOSSA_APP_SHORT_NAME = "wikilibras" | |
18 | +PYBOSSA_APP_SHORT_NAME = "wikilibras" | |
16 | 19 | PYBOSSA_APP_DESCRIPTION = "Esse projeto possibilitará que voluntários contribuam na expansão de um dicionário de LIBRAS." |
17 | -PYBOSSA_ENDPOINT = "http://0.0.0.0:5000" | |
18 | -#PYBOSSA_API_KEY = "263302c0-07eb-44e4-956c-9b34cc301553" | |
19 | -PYBOSSA_API_KEY = "ed85ccd7-1417-4886-88bb-2e760509cef2" | |
20 | +PYBOSSA_ENDPOINT = "http://150.165.204.35/pybossa" | |
21 | +PYBOSSA_API_KEY = "0176e74e-4f70-45ef-bc75-6c6ebae8d170" | ... | ... |
settings_local.py.tmpl
... | ... | @@ -16,5 +16,5 @@ APACHE_STATIC_FILES_ENDPOINT = "/wikilibras" |
16 | 16 | PYBOSSA_APP_NAME = "WikiLibras" |
17 | 17 | PYBOSSA_APP_SHORT_NAME = "wikilibras" |
18 | 18 | PYBOSSA_APP_DESCRIPTION = "Esse projeto possibilitará que voluntários contribuam na expansão de um dicionário de LIBRAS." |
19 | -PYBOSSA_ENDPOINT = "http://localhost:5000" | |
19 | +PYBOSSA_ENDPOINT = "http://localhost:201" | |
20 | 20 | PYBOSSA_API_KEY = "my-api-key" |
21 | 21 | \ No newline at end of file | ... | ... |
view/assets/css/main.css
... | ... | @@ -500,7 +500,8 @@ ul.rig.columns-4 li { |
500 | 500 | |
501 | 501 | #approval-msg { |
502 | 502 | display: none; |
503 | - margin: 0px; | |
503 | + margin: 0px; | |
504 | + padding-left: 14px; | |
504 | 505 | } |
505 | 506 | |
506 | 507 | /* Thanks Screen */ |
... | ... | @@ -519,4 +520,4 @@ ul.rig.columns-4 li { |
519 | 520 | |
520 | 521 | #completed-all-task-msg { |
521 | 522 | display: none; |
522 | -} | |
523 | 523 | \ No newline at end of file |
524 | +} | ... | ... |
view/assets/js/wikilibras.js
... | ... | @@ -324,22 +324,50 @@ |
324 | 324 | _getRenderedAvatarUrl(userId, signName)); |
325 | 325 | $("#render-avatar").fadeIn(300); |
326 | 326 | } |
327 | + | |
328 | + function _showInitialScreen(toShow) { | |
329 | + if (toShow) { | |
330 | + $("#initial-screen").fadeIn(300); | |
331 | + $("#initial-screen video").get(0).play(); | |
332 | + } else { | |
333 | + $("#initial-screen").hide(); | |
334 | + $("#initial-screen video").get(0).pause(); | |
335 | + } | |
336 | + } | |
337 | + | |
338 | + function _showConfigurationScreen(toShow) { | |
339 | + if (toShow) { | |
340 | + $("#configuration-screen").show(); | |
341 | + $("#ref-video-container video").get(0).play(); | |
342 | + } else { | |
343 | + $("#configuration-screen").hide(); | |
344 | + $("#ref-video-container video").get(0).pause(); | |
345 | + } | |
346 | + } | |
347 | + | |
348 | + function _showRenderScreen(toShow) { | |
349 | + if (toShow) { | |
350 | + $("#render-screen").fadeIn(300); | |
351 | + $("#render-ref video").get(0).play(); | |
352 | + $("#render-avatar video").get(0).play(); | |
353 | + } else { | |
354 | + $("#render-screen").hide(); | |
355 | + $("#render-ref video").get(0).pause(); | |
356 | + $("#render-avatar video").get(0).pause(); | |
357 | + } | |
358 | + } | |
327 | 359 | |
328 | 360 | function _setupRenderScreen() { |
329 | - $("#configuration-screen").hide(); | |
361 | + _showConfigurationScreen(false); | |
362 | + _showRenderScreen(true); | |
330 | 363 | $("#render-avatar").hide(); |
331 | - $("#render-screen").show(); | |
332 | 364 | $("#render-loading").fadeIn(300); |
333 | - $("#render-ref video").prop("controls", false); | |
334 | - $("#render-ref video").get(0).pause(); | |
335 | 365 | $("#render-button-container .btn").hide(); |
336 | 366 | $("#finish-button").addClass("disabled"); |
337 | 367 | $("#finish-button").show(); |
338 | 368 | |
339 | 369 | _submitParameterJSON(function() { |
340 | 370 | $("#render-loading").fadeOut(300); |
341 | - $("#render-ref video").prop("controls", true); | |
342 | - $("#render-ref video").get(0).play(); | |
343 | 371 | $("#finish-button").removeClass("disabled"); |
344 | 372 | _showRenderedAvatar(parsedParameterJSON); |
345 | 373 | }); |
... | ... | @@ -349,10 +377,9 @@ |
349 | 377 | $("#render-button-container .btn").hide(); |
350 | 378 | $("#approval-button").show(); |
351 | 379 | $("#approval-msg").show(); |
352 | - $("#render-ref video").get(0).play(); | |
353 | 380 | |
354 | 381 | _showRenderedAvatar(parameterJSON); |
355 | - $("#render-screen").fadeIn(300); | |
382 | + _showRenderScreen(true); | |
356 | 383 | } |
357 | 384 | |
358 | 385 | function _submitAnswer(task, deferred, status) { |
... | ... | @@ -362,7 +389,7 @@ |
362 | 389 | } else { |
363 | 390 | _saveAnswer(task, deferred, answer); |
364 | 391 | } |
365 | - $("#render-screen").hide(); | |
392 | + _showRenderScreen(false); | |
366 | 393 | $("#thanks-screen").show(); |
367 | 394 | } |
368 | 395 | |
... | ... | @@ -383,12 +410,12 @@ |
383 | 410 | if (hasLastAnswer) { |
384 | 411 | _setupApprovalScreen(last_answer.parameter_json); |
385 | 412 | } else { |
386 | - $("#initial-screen").fadeIn(300); | |
413 | + _showInitialScreen(true); | |
387 | 414 | } |
388 | 415 | |
389 | 416 | $("#start-button").off("click").on("click", function() { |
390 | - $("#initial-screen").hide(); | |
391 | - $("#configuration-screen").show(); | |
417 | + _showInitialScreen(false); | |
418 | + _showConfigurationScreen(true); | |
392 | 419 | }); |
393 | 420 | $("#ready-button").off("click").on("click", function() { |
394 | 421 | if ($(this).hasClass('disabled')) { |
... | ... | @@ -398,8 +425,8 @@ |
398 | 425 | _setupRenderScreen(); |
399 | 426 | }); |
400 | 427 | $("#render-edit").off("click").on("click", function() { |
401 | - $("#render-screen").hide(); | |
402 | - $("#configuration-screen").show(); | |
428 | + _showRenderScreen(false); | |
429 | + _showConfigurationScreen(true); | |
403 | 430 | }); |
404 | 431 | $("#finish-button").off("click").on("click", function() { |
405 | 432 | if ($(this).hasClass('disabled')) { | ... | ... |
view/template.html
... | ... | @@ -63,7 +63,7 @@ |
63 | 63 | <div id="ref-video-panel" class="col-sm-12"> |
64 | 64 | <div id="ref-video-container" class="col-sm-10"> |
65 | 65 | <video src="" preload="metadata" |
66 | - class="ref-video video-body-main video-border" autoplay loop | |
66 | + class="ref-video video-body-main video-border" loop | |
67 | 67 | controls> |
68 | 68 | <source type="video/webm"> |
69 | 69 | </video> |
... | ... | @@ -298,11 +298,11 @@ |
298 | 298 | </div> |
299 | 299 | <div id="teached-signs-container" class="sub-main-container"> |
300 | 300 | <h4 class="teached-signs-msg" type="none">Você ainda não ensinou |
301 | - sinais a Ícaro.</h4> | |
302 | - <h4 class="teached-signs-msg" type="one">Você já ensinou a Ícaro | |
301 | + sinais ao Ícaro.</h4> | |
302 | + <h4 class="teached-signs-msg" type="one">Você já ensinou ao Ícaro | |
303 | 303 | 1 sinal de LIBRAS.</h4> |
304 | 304 | <h4 class="teached-signs-msg" type="more"> |
305 | - Você já ensinou a Ícaro <span>x</span> sinais de LIBRAS. | |
305 | + Você já ensinou ao Ícaro <span>x</span> sinais de LIBRAS. | |
306 | 306 | </h4> |
307 | 307 | <div id="signs-list-container" class="row"></div> |
308 | 308 | <div id="teached-sign-modal" class="modal fade" tabindex="-1" |
... | ... | @@ -318,11 +318,11 @@ |
318 | 318 | </div> |
319 | 319 | </div> |
320 | 320 | <div id="tutorial-container" class="sub-main-container"> |
321 | - <h4>Aprenda como ensinar uma expressão a Ícaro.</h4> | |
321 | + <h4>Aprenda como ensinar o Ícaro uma expressão.</h4> | |
322 | 322 | <iframe width="560" height="315" |
323 | 323 | src="http://www.youtube.com/embed/AFRxTpNJc4I?controls=2&showinfo=0"> |
324 | 324 | </iframe> |
325 | - <h4>Aprenda como ensinar uma configuração de mão a Ícaro.</h4> | |
325 | + <h4>Aprenda como ensinar o Ícaro uma configuração de mão.</h4> | |
326 | 326 | <iframe width="560" height="315" |
327 | 327 | src="http://www.youtube.com/embed/JJV2DX8s1rg?controls=2&showinfo=0"> |
328 | 328 | </iframe> |
... | ... | @@ -351,4 +351,4 @@ |
351 | 351 | <script type="text/javascript"> |
352 | 352 | wikilibras.run("{{ server }}", "{{ server_backend }}", |
353 | 353 | "{{ app_shortname }}", "{{ api_host }}", "{{ upload_sign_host }}"); |
354 | -</script> | |
355 | 354 | \ No newline at end of file |
355 | +</script> | ... | ... |
view/videos/CALAR_REF.webm
No preview for this file type
wikilibras.py
... | ... | @@ -4,42 +4,37 @@ from werkzeug import secure_filename |
4 | 4 | import pbclient |
5 | 5 | import os |
6 | 6 | import pyutil |
7 | +import requests | |
8 | +import tempfile | |
9 | +import shutil | |
7 | 10 | |
8 | 11 | class Wikilibras: |
9 | - | |
12 | + | |
10 | 13 | def __init__(self, configuration, template_env): |
11 | 14 | self.config = configuration |
12 | 15 | self.env = template_env |
13 | 16 | self.__setup_pb_client() |
14 | - | |
17 | + | |
15 | 18 | def __setup_pb_client(self): |
16 | - pbclient.set('endpoint', self.config['PYBOSSA_ENDPOINT']) | |
19 | + pbclient.set('endpoint', self.config['PYBOSSA_ENDPOINT']) | |
17 | 20 | pbclient.set('api_key', self.config['PYBOSSA_API_KEY']) |
18 | - | |
21 | + | |
19 | 22 | def __find_project(self, app_short_name): |
20 | 23 | projects = pbclient.find_project(short_name=app_short_name) |
21 | 24 | return projects[0] if len(projects) > 0 else None |
22 | - | |
25 | + | |
23 | 26 | def __setup_project(self, project): |
24 | - self.__create_tasks(project) | |
25 | 27 | self.__update_project_info(project) |
26 | - | |
27 | - def __create_tasks(self, project): | |
28 | - test_signs = ["CALAR", "ENSINADO", "ENTANTO", "ENTENDIDO"] | |
29 | - #test_signs = ["CALAR"] | |
30 | - for sign in test_signs: | |
31 | - task = dict(sign_name=sign, submission_date=pyutil.get_date_now()) | |
32 | - pbclient.create_task(project.id, task) | |
33 | - | |
28 | + | |
34 | 29 | def __update_project_info(self, project): |
35 | 30 | template = self.env.get_template('template.html') |
36 | 31 | project.info['task_presenter'] = template.render(server=self.config['HOST_STATIC_FILES_ENDPOINT'], server_backend=self.config['HOST_ENDPOINT'], app_shortname=self.config['PYBOSSA_APP_SHORT_NAME'], api_host=self.config['API_HOST'], homepage_url=self.config['HOMEPAGE_URL'], upload_sign_host=self.config['UPLOAD_SIGN_HOST']) |
37 | 32 | project.info['thumbnail'] = self.config['HOST_STATIC_FILES_ENDPOINT'] + "/img/thumbnail.png" |
38 | 33 | project.info['sched'] = "incremental" |
34 | + project.info['published'] = True | |
39 | 35 | project.allow_anonymous_contributors = False |
40 | - project.published = True | |
41 | 36 | pbclient.update_project(project) |
42 | - | |
37 | + | |
43 | 38 | def create_project(self): |
44 | 39 | app_short_name = self.config['PYBOSSA_APP_SHORT_NAME'] |
45 | 40 | project = self.__find_project(app_short_name) |
... | ... | @@ -51,30 +46,30 @@ class Wikilibras: |
51 | 46 | if (project): |
52 | 47 | self.__setup_project(project) |
53 | 48 | result_msg = "The project " + app_short_name + " was created." |
54 | - else: | |
49 | + else: | |
55 | 50 | result_msg = "The project " + app_short_name + " couldn't be created. Check the server log for details." |
56 | 51 | pyutil.log(result_msg) |
57 | - return result_msg | |
52 | + return result_msg | |
58 | 53 | |
59 | - def update_project(self): | |
54 | + def update_project(self): | |
60 | 55 | app_short_name = self.config['PYBOSSA_APP_SHORT_NAME'] |
61 | 56 | project = self.__find_project(app_short_name) |
62 | 57 | self.__update_project_info(project) |
63 | 58 | result_msg = "The project " + app_short_name + " was updated." |
64 | 59 | pyutil.log(result_msg) |
65 | 60 | return result_msg |
66 | - | |
61 | + | |
67 | 62 | def __find_task(self, project_id, task_id): |
68 | 63 | tasks = pbclient.find_tasks(project_id, id=task_id) |
69 | 64 | return tasks[0] if len(tasks) > 0 else None |
70 | - | |
65 | + | |
71 | 66 | def __find_taskruns(self, project_id, task_id): |
72 | 67 | return pbclient.find_taskruns(project_id, id=task_id) |
73 | - | |
68 | + | |
74 | 69 | def __number_of_taskruns(self, project_id, task_id): |
75 | 70 | taskruns = self.__find_taskruns(project_id, task_id) |
76 | 71 | return len(taskruns) |
77 | - | |
72 | + | |
78 | 73 | def __close_task(self, project_id, task_id): |
79 | 74 | pyutil.log("Closing the task with ID=" + str(task_id) + ".") |
80 | 75 | task = self.__find_task(project_id, task_id) |
... | ... | @@ -82,15 +77,41 @@ class Wikilibras: |
82 | 77 | task.n_answers = number_of_taskruns + 1 |
83 | 78 | pbclient.update_task(task) |
84 | 79 | return "The task with ID=" + str(task_id) + " was closed." |
85 | - | |
80 | + | |
81 | + def get_file(self, url, filename): | |
82 | + r = requests.get(url, stream = True) | |
83 | + if (r.status_code == 200): | |
84 | + with open(filename, 'wb') as f: | |
85 | + for chunk in r.iter_content(chunk_size = 1024): | |
86 | + if chunk: | |
87 | + f.write(chunk) | |
88 | + return True | |
89 | + return False | |
90 | + | |
86 | 91 | def finish_task(self): |
87 | 92 | task_id = request.form['task_id'] |
93 | + api_host = self.config['API_HOST'] | |
94 | + api_dbhost = self.config['API_DB_HOST'] | |
95 | + user_id = request.form['user_id'] | |
96 | + sign_name = request.form['sign_name'] | |
88 | 97 | project_id = request.form['project_id'] |
89 | 98 | number_of_approval = int(request.form['number_of_approval']) |
90 | 99 | agreement_number = self.config['AGREEMENT_NUMBER'] |
91 | 100 | result_msg = "" |
92 | 101 | code = 200 |
93 | 102 | if (number_of_approval >= agreement_number): |
103 | + tmp_dir = tempfile.NamedTemporaryFile().name | |
104 | + if not os.path.exists(tmp_dir): | |
105 | + os.makedirs(tmp_dir) | |
106 | + blend_path = os.path.join(tmp_dir, sign_name + ".blend") | |
107 | + video_path = os.path.join(tmp_dir, sign_name + ".webm") | |
108 | + blend_downloaded = self.get_file(('%s/public/%s/%s.blend' % (api_host, user_id, sign_name)), blend_path) | |
109 | + video_downloaded = self.get_file(('%s/public/%s/%s.webm' % (api_host, user_id, sign_name)), video_path) | |
110 | + if (blend_downloaded and video_downloaded): | |
111 | + files = [ ("video", (video_path, open(video_path,"rb"))), ("video", (blend_path, open(blend_path, "rb"))) ] | |
112 | + values = { "nome": sign_name, "selo": 1, "wikilibras": True, "overwrite": True } | |
113 | + r = requests.post(("%s/addsinal" % (api_dbhost)), files=files, data=values) | |
114 | + shutil.rmtree(tmp_dir) | |
94 | 115 | result_msg = self.__close_task(project_id, task_id) |
95 | 116 | else: |
96 | 117 | result_msg = "The task with ID=" + str(task_id) + " didn't reach the agreement number yet." | ... | ... |