Source code for fmn.database.model.tracking_rule

# SPDX-FileCopyrightText: Contributors to the Fedora Project
#
# SPDX-License-Identifier: MIT

from importlib.metadata import entry_points
from typing import TYPE_CHECKING

from sqlalchemy import JSON, Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship

from ..main import Base

if TYPE_CHECKING:
    from fedora_messaging.message import Message

    from ...rules.requester import Requester


[docs]class TrackingRule(Base): __tablename__ = "tracking_rules" id = Column(Integer, primary_key=True, nullable=False) # Unique: there can be only one TrackingRule per Rule rule_id = Column(Integer, ForeignKey("rules.id"), nullable=False, unique=True) rule = relationship("Rule", back_populates="tracking_rule", uselist=False) name = Column(String(length=255), nullable=False) params = Column(JSON)
[docs] def get_implementation(self, requester: "Requester"): eps = entry_points(group="fmn.tracking_rules", name=self.name) if len(eps) != 1: raise ValueError(f"Unknown tracking rule: {self.name}") impl_class = eps[self.name].load() owner = self.rule.user.name return impl_class(requester, self.params, owner)
[docs] async def matches(self, message: "Message", requester: "Requester"): impl = self.get_implementation(requester) return await impl.matches(message)
[docs] async def prime_cache(self, cache, requester: "Requester"): impl = self.get_implementation(requester) return await impl.prime_cache(cache)