86 lines
2.8 KiB
Python
86 lines
2.8 KiB
Python
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from sqlalchemy import UniqueConstraint
|
|
|
|
from flaschengeist.models import ModelSerializeMixin, UtcDateTime
|
|
from flaschengeist.models.user import User
|
|
from flaschengeist.database import db
|
|
|
|
#########
|
|
# Types #
|
|
#########
|
|
|
|
|
|
class EventType(db.Model, ModelSerializeMixin):
|
|
__tablename__ = "schedule_event_type"
|
|
id: int = db.Column("id", db.Integer, primary_key=True)
|
|
name: str = db.Column(db.String(30), nullable=False, unique=True)
|
|
|
|
|
|
class JobType(db.Model, ModelSerializeMixin):
|
|
__tablename__ = "schedule_job_type"
|
|
id: int = db.Column("id", db.Integer, primary_key=True)
|
|
name: str = db.Column(db.String(30), nullable=False, unique=True)
|
|
|
|
|
|
########
|
|
# Jobs #
|
|
########
|
|
|
|
|
|
class Service(db.Model, ModelSerializeMixin):
|
|
__tablename__ = "schedule_service"
|
|
userid: str = ""
|
|
value: float = db.Column(db.Numeric(precision=3, scale=2, asdecimal=False), nullable=False)
|
|
|
|
_job_id = db.Column("job_id", db.Integer, db.ForeignKey("schedule_job.id"), nullable=False, primary_key=True)
|
|
_user_id = db.Column("user_id", db.Integer, db.ForeignKey("user.id"), nullable=False, primary_key=True)
|
|
|
|
user_: User = db.relationship("User")
|
|
job_ = db.relationship("Job")
|
|
|
|
@property
|
|
def userid(self):
|
|
return self.user_.userid
|
|
|
|
|
|
class Job(db.Model, ModelSerializeMixin):
|
|
__tablename__ = "schedule_job"
|
|
_type_id = db.Column("type_id", db.Integer, db.ForeignKey("schedule_job_type.id"), nullable=False)
|
|
_event_id = db.Column("event_id", db.Integer, db.ForeignKey("schedule_event.id"), nullable=False)
|
|
|
|
id: int = db.Column("id", db.Integer, primary_key=True)
|
|
start: datetime = db.Column(UtcDateTime, nullable=False)
|
|
end: Optional[datetime] = db.Column(UtcDateTime)
|
|
comment: str = db.Column(db.String(256))
|
|
type: JobType = db.relationship("JobType")
|
|
services: [Service] = db.relationship("Service", back_populates="job_")
|
|
required_services: float = db.Column(db.Numeric(precision=4, scale=2, asdecimal=False), nullable=False)
|
|
|
|
event_ = db.relationship("Event", back_populates="jobs")
|
|
|
|
__table_args__ = (UniqueConstraint("type_id", "start", name="_type_start_uc"),)
|
|
|
|
|
|
##########
|
|
# Events #
|
|
##########
|
|
|
|
|
|
class Event(db.Model, ModelSerializeMixin):
|
|
"""Model for an Event"""
|
|
|
|
__tablename__ = "schedule_event"
|
|
_type_id = db.Column(
|
|
"type_id", db.Integer, db.ForeignKey("schedule_event_type.id", ondelete="CASCADE"), nullable=False
|
|
)
|
|
|
|
id: int = db.Column(db.Integer, primary_key=True)
|
|
start: datetime = db.Column(UtcDateTime, nullable=False)
|
|
description: Optional[str] = db.Column(db.String(255))
|
|
type: EventType = db.relationship("EventType")
|
|
jobs: [Job] = db.relationship(
|
|
"Job", back_populates="event_", cascade="all,delete,delete-orphan", order_by="[Job.start, Job.end]"
|
|
)
|