From 8cec86ad3bfdf6d17a5867931194153add9bf5a4 Mon Sep 17 00:00:00 2001 From: Muhammad Khatri Date: Fri, 11 Oct 2019 14:54:25 -0500 Subject: [PATCH 1/3] chore: remove worker and thread count from procfile --- Procfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Procfile b/Procfile index 77dff3e..2503d99 100644 --- a/Procfile +++ b/Procfile @@ -1,2 +1,2 @@ worker: celery -A gavel:celery worker -web: python initialize.py && gunicorn gavel:app -w 3 -t 3 +web: python initialize.py && gunicorn gavel:app From 06a8b5b087c12447e1f7d9f6da900a73a8ff8648 Mon Sep 17 00:00:00 2001 From: Muhammad Khatri Date: Fri, 11 Oct 2019 14:54:47 -0500 Subject: [PATCH 2/3] chore: added EMAIL_PORT to heroku config items --- app.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app.json b/app.json index 9132bca..f22f885 100644 --- a/app.json +++ b/app.json @@ -23,7 +23,8 @@ "EMAIL_USER": "_unused_", "EMAIL_PASSWORD": "_unused_", "IGNORE_CONFIG_FILE": "true", - "EMAIL_HOST": "smtp.gmail.com" + "EMAIL_HOST": "smtp.gmail.com", + "EMAIL_PORT": "587" }, "keywords": [ "gavel", From 382d9aab093cf894d170925225afaea70bd3a43f Mon Sep 17 00:00:00 2001 From: Muhammad Khatri Date: Fri, 11 Oct 2019 14:55:29 -0500 Subject: [PATCH 3/3] fix: use asyncio and event loop wrapper to ensure function runs safely --- gavel/controllers/admin.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/gavel/controllers/admin.py b/gavel/controllers/admin.py index 08547af..0fc5b7a 100644 --- a/gavel/controllers/admin.py +++ b/gavel/controllers/admin.py @@ -1,13 +1,7 @@ -from celery.utils.serialization import jsonify - from gavel import app from gavel.models import * -from gavel.schemas.annotator import AnnotatorSchema -from gavel.schemas.decision import DecisionSchema -from gavel.schemas.flag import FlagSchema -from gavel.schemas.item import ItemSchema -from gavel.schemas.setting import SettingSchema from gavel.constants import * +from functools import wraps import gavel.settings as settings import gavel.utils as utils from flask import ( @@ -23,6 +17,17 @@ import urllib3 import xlrd +import asyncio + +loop = asyncio.get_event_loop() + +def async_action(f): + @wraps(f) + def wrapped(*args, **kwargs): + return loop.run_until_complete(f(*args, **kwargs)) + return wrapped + + ALLOWED_EXTENSIONS = {'csv', 'xlsx', 'xls'} @@ -549,7 +554,7 @@ def annotator_detail(annotator_id): def annotator_link(annotator): return urllib.parse.urljoin(settings.BASE_URL, url_for('login', secret=annotator.secret)) - +@async_action async def email_invite_links(annotators): if settings.DISABLE_EMAIL or annotators is None: return