"""Model and functions to work with task logs.""" from datetime import datetime from sqlalchemy import Column from sqlalchemy import DateTime from sqlalchemy import Enum from sqlalchemy import ForeignKey from sqlalchemy import Text from sqlalchemy.dialects import mysql from availability.connectors import sql from availability.constants import models from availability.models import error_handlers class TaskLog(sql.BaseModel): """Class representing a task_log table. Table is used to store information about failed task as well as information about failed and stuck tasks that have been re-queued. """ __tablename__ = models.TASK_LOG_TABLE task_log_id = Column( 'id', mysql.INTEGER(unsigned=True), primary_key=True, autoincrement=True) task_id = Column( mysql.INTEGER(unsigned=True), ForeignKey('task.id'), nullable=False) message_type = Column( Enum(*models.TASK_LOG_TYPES_ENUM), default=models.TASK_LOG_TYPE_FAILED) message = Column(Text, nullable=False) datetime = Column(DateTime, default=datetime.utcnow, nullable=False) @error_handlers.sqlalchemy_error_handler def create_task_log(task_id, message_type, message): """Create a records in task_log table. Args: task_id (int): Task PKs. message_type (str): One of models.TASK_LOG_TYPES_ENUM. message (str): Message that should be logged. """ task_log = TaskLog( task_id=task_id, message=message, message_type=message_type) with sql.session_scope() as session: session.add(task_log) @error_handlers.sqlalchemy_error_handler def bulk_create_task_log(task_ids, message_type, message): """Create several records with the same message_type and message. Args: task_ids (list): List (or any other iterable) of Task PKs. message_type (str): One of models.TASK_LOG_TYPES_ENUM. message (str): Message that should be logged. """ records = [] for task_id in task_ids: records.append(TaskLog( task_id=task_id, message=message, message_type=message_type)) if not records: return with sql.session_scope() as session: session.bulk_save_objects(records)