Source code for fmn.database.model.rule
# SPDX-FileCopyrightText: Contributors to the Fedora Project
#
# SPDX-License-Identifier: MIT
import logging
from functools import cache
from typing import TYPE_CHECKING
from sqlalchemy import Boolean, Column, ForeignKey, Integer, UnicodeText, select
from sqlalchemy.orm import relationship, selectinload
from sqlalchemy.sql import Select, expression
from ..main import Base
from .generated import Generated
from .generation_rule import GenerationRule
from .tracking_rule import TrackingRule
from .user import User
if TYPE_CHECKING:
from fedora_messaging.message import Message
from ...rules.requester import Requester
log = logging.getLogger(__name__)
[docs]class Rule(Base):
__tablename__ = "rules"
id = Column(Integer, primary_key=True, nullable=False)
name = Column(UnicodeText, nullable=True)
disabled = Column(
Boolean, default=False, nullable=False, index=True, server_default=expression.text("FALSE")
)
user_id = Column(Integer, ForeignKey(User.id, ondelete="CASCADE"), nullable=False)
user = relationship(User, back_populates="rules")
tracking_rule = relationship(
TrackingRule, back_populates="rule", uselist=False, cascade="all, delete-orphan"
)
generation_rules = relationship(
GenerationRule, back_populates="rule", cascade="all, delete-orphan"
)
generated = relationship(Generated, back_populates="rule", cascade="all, delete-orphan")
[docs] async def handle(self, message: "Message", requester: "Requester"):
log.debug("Rule %s handling message %s", self.id, message.id)
if not await self.tracking_rule.matches(message, requester):
return
for generation_rule in self.generation_rules:
async for notification in generation_rule.handle(message, requester):
yield notification