Send confirmation mails in the interface

This commit is contained in:
Jan Losinski 2019-01-21 22:23:28 +01:00
parent 1415b8e37f
commit c49e8becbc
1 changed files with 18 additions and 9 deletions

View File

@ -15,7 +15,7 @@ from aiohttp import web
from email_validator import validate_email, EmailNotValidError from email_validator import validate_email, EmailNotValidError
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload
from . import model from . import model, mailer
logger = logging.Logger(__name__) logger = logging.Logger(__name__)
@ -96,17 +96,15 @@ class _ViewBase(web.View):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(_ViewBase, self).__init__(*args, **kwargs) super(_ViewBase, self).__init__(*args, **kwargs)
@property
def _mail(self) -> mailer.Mailer:
return self.request.app['mailer']
@property @property
def _db(self) -> model.DatabaseManager: def _db(self) -> model.DatabaseManager:
return self.request.app['db'] # type: model.DatabaseManager return self.request.app['db'] # type: model.DatabaseManager
class IndexView(_ViewBase):
@aiohttp_jinja2.template("index.html")
def get(self):
pass
class CreateEntryView(_ViewBase): class CreateEntryView(_ViewBase):
@aiohttp_jinja2.template("form.html") @aiohttp_jinja2.template("form.html")
def get(self): def get(self):
@ -144,6 +142,15 @@ class CreateEntryView(_ViewBase):
session.add_all([request, request_data]) session.add_all([request, request_data])
session.commit() session.commit()
loop = asyncio.get_event_loop()
def send_mail(mail, email, key):
loop.create_task(mail.send_confirmation_email(email, key))
loop.call_soon_threadsafe(
functools.partial(send_mail, self._mail, request_data.email, request.key))
raise web.HTTPFound(self.request.app.router["detail"].url_for(entry_id=key)) raise web.HTTPFound(self.request.app.router["detail"].url_for(entry_id=key))
errors.update(validator.errors) errors.update(validator.errors)
@ -230,8 +237,9 @@ def simple_view(template):
class App(object): class App(object):
def __init__(self, database_manager: model.DatabaseManager, base_url: str): def __init__(self, database_manager: model.DatabaseManager, mail: mailer.Mailer, base_url: str):
self.db = database_manager self.db = database_manager
self.mail = mail
self.base_url = base_url self.base_url = base_url
self.app = web.Application() self.app = web.Application()
@ -240,6 +248,7 @@ class App(object):
def setup_app(self): def setup_app(self):
self.app['db'] = self.db self.app['db'] = self.db
self.app["mailer"] = self.mail
aiohttp_jinja2.setup( aiohttp_jinja2.setup(
self.app, loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates'))) self.app, loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates')))
@ -250,7 +259,7 @@ class App(object):
self.app.router.add_static('/static/', self.app.router.add_static('/static/',
path=os.path.join(os.path.dirname(__file__), 'static'), path=os.path.join(os.path.dirname(__file__), 'static'),
name='static') name='static')
self.app.router.add_view("/", IndexView, name="index") self.app.router.add_view("/", simple_view("index.html"), name="index")
self.app.router.add_view("/create", CreateEntryView, name="create") self.app.router.add_view("/create", CreateEntryView, name="create")
self.app.router.add_view("/show/{entry_id}", EntryDetailView, name="detail") self.app.router.add_view("/show/{entry_id}", EntryDetailView, name="detail")
self.app.router.add_view("/cancel/{entry_id}", DeleteEntryView, name="cancel") self.app.router.add_view("/cancel/{entry_id}", DeleteEntryView, name="cancel")