Source code for invenio_accounts.tasks

# -*- coding: utf-8 -*-
#
# This file is part of Invenio.
# Copyright (C) 2015-2018 CERN.
#
# Invenio is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.

"""Background tasks for accounts."""

from datetime import datetime

from celery import shared_task
from flask import current_app
from flask_mail import Message
from invenio_db import db

from .models import LoginInformation, SessionActivity
from .sessions import delete_session


[docs]@shared_task def send_security_email(data): """Celery task to send security email. :param data: Contains the email data. """ msg = Message() msg.__dict__.update(data) current_app.extensions["mail"].send(msg)
[docs]@shared_task def clean_session_table(): """Automatically clean session table. To enable a periodically clean of the session table, you should configure the task as a celery periodic task. .. code-block:: python from datetime import timedelta CELERYBEAT_SCHEDULE = { 'session_cleaner': { 'task': 'invenio_accounts.tasks.clean_session_table', 'schedule': timedelta(days=1), }, } See `Invenio-Celery <https://invenio-celery.readthedocs.io/>`_ documentation for further details. """ sessions = SessionActivity.query_by_expired().all() for session in sessions: delete_session(sid_s=session.sid_s) db.session.commit()
@shared_task def delete_ips(): """Automatically remove login_info.last_login_ip older than 30 days.""" expiration_date = ( datetime.utcnow() - current_app.config["ACCOUNTS_RETENTION_PERIOD"] ) LoginInformation.query.filter( LoginInformation.last_login_ip.isnot(None), LoginInformation.last_login_at < expiration_date, ).update({LoginInformation.last_login_ip: None}) LoginInformation.query.filter( LoginInformation.current_login_ip.isnot(None), LoginInformation.current_login_at < expiration_date, ).update({LoginInformation.current_login_ip: None}) db.session.commit()