eventcally/project/models/admin_unit_verification_request.py
2023-07-13 08:58:04 +02:00

76 lines
2.4 KiB
Python

from enum import IntEnum
from sqlalchemy import CheckConstraint, Column, Integer, UniqueConstraint
from sqlalchemy.event import listens_for
from sqlalchemy.ext.hybrid import hybrid_property
from project import db
from project.dbtypes import IntegerEnum
from project.models.trackable_mixin import TrackableMixin
from project.utils import make_check_violation
class AdminUnitVerificationRequestReviewStatus(IntEnum):
inbox = 1
verified = 2
rejected = 3
class AdminUnitVerificationRequestRejectionReason(IntEnum):
notresponsible = 1
missinginformation = 2
unknown = 3
untrustworthy = 4
illegal = 5
irrelevant = 6
class AdminUnitVerificationRequest(db.Model, TrackableMixin):
__tablename__ = "adminunitverificationrequest"
__table_args__ = (
UniqueConstraint("source_admin_unit_id", "target_admin_unit_id"),
CheckConstraint(
"source_admin_unit_id != target_admin_unit_id",
name="auvr_source_neq_target",
),
)
id = Column(Integer(), primary_key=True)
source_admin_unit_id = db.Column(
db.Integer, db.ForeignKey("adminunit.id", ondelete="CASCADE"), nullable=False
)
target_admin_unit_id = db.Column(
db.Integer, db.ForeignKey("adminunit.id", ondelete="CASCADE"), nullable=False
)
review_status = Column(IntegerEnum(AdminUnitVerificationRequestReviewStatus))
rejection_reason = Column(IntegerEnum(AdminUnitVerificationRequestRejectionReason))
@hybrid_property
def verified(self):
return self.review_status == AdminUnitVerificationRequestReviewStatus.verified
def validate(self):
source_id = (
self.source_admin_unit.id
if self.source_admin_unit
else self.source_admin_unit_id
)
target_id = (
self.target_admin_unit.id
if self.target_admin_unit
else self.target_admin_unit_id
)
if source_id == target_id: # pragma: no cover
raise make_check_violation("There must be no self-reference.")
@listens_for(AdminUnitVerificationRequest, "before_insert")
@listens_for(AdminUnitVerificationRequest, "before_update")
def before_saving_admin_unit_verification_request(mapper, connect, self):
if self.review_status != AdminUnitVerificationRequestReviewStatus.rejected:
self.rejection_reason = None
if self.rejection_reason == 0:
self.rejection_reason = None
self.validate()