Source code for asclepias_broker.events.models

# -*- coding: utf-8 -*-
#
# Copyright (C) 2018 CERN.
# Copyright (c) 2017 Thomas P. Robitaille.
#
# Asclepias Broker is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.
"""Event database models."""

import enum
import uuid
from typing import Union

from invenio_accounts.models import User
from invenio_db import db
from sqlalchemy.schema import PrimaryKeyConstraint
from sqlalchemy_utils.models import Timestamp
from sqlalchemy_utils.types import JSONType, UUIDType

from ..core.models import Identifier, Relationship


[docs]class EventStatus(enum.Enum): """Event status.""" New = 1 Processing = 2 Error = 3 Done = 4
[docs]class PayloadType(enum.Enum): """Payload type.""" Relationship = 1 Identifier = 2
[docs]class Event(db.Model, Timestamp): """Event model.""" __tablename__ = 'event' id = db.Column(UUIDType, default=uuid.uuid4, primary_key=True) payload = db.Column(JSONType) status = db.Column(db.Enum(EventStatus), nullable=False) user_id = db.Column(db.Integer, db.ForeignKey(User.id), nullable=True) user = db.relationship(User)
[docs] @classmethod def get(cls, id: str = None, **kwargs): """Get the event from the database.""" return cls.query.filter_by(id=id).one_or_none()
def __repr__(self): """String representation of the event.""" return f"<{self.id}: {self.created}>"
[docs]class ObjectEvent(db.Model, Timestamp): """Event related to an Identifier or Relationship.""" __tablename__ = 'objectevent' __table_args__ = ( PrimaryKeyConstraint( 'event_id', 'object_uuid', 'payload_type', 'payload_index', name='pk_objectevent'), ) event_id = db.Column(UUIDType, db.ForeignKey(Event.id), nullable=False) object_uuid = db.Column(UUIDType, nullable=False) payload_type = db.Column(db.Enum(PayloadType), nullable=False) payload_index = db.Column(db.Integer, nullable=False) event = db.relationship(Event, backref='object_events') @property def object(self) -> Union[Identifier, Relationship]: """Get the associated Identifier or Relationship.""" if self.payload_type == PayloadType.Identifier: return Identifier.query.get(self.object_uuid) else: return Relationship.query.get(self.object_uuid) def __repr__(self): """String representation of the object event.""" return f"<{self.event_id}: {self.object_uuid}>"