"""Approval Model.""" from datetime import datetime, timezone from flask import g from owsresponse import status from product_review.api import db from product_review.util import exception as exception_util class Approval(db.Model): """Approval model.""" __tablename__ = "approval" approval_id = db.Column( "id", db.Integer, primary_key=True, autoincrement=True, nullable=False ) review_queue_id = db.Column( db.Integer, db.ForeignKey("review_queue.id"), nullable=False ) user_id = db.Column(db.String, nullable=False) created_datetime = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) note = db.Column(db.String, nullable=True) def to_dict(self): """Return a dictionary of output properties.""" items = {} for c in self.__table__.columns: column_name = "approval_id" if c.name == "id" else c.name items[column_name] = getattr(self, column_name) return items def approve(review_queue_id, *, note=None, user_id=None, created_datetime=None): """Approve a product.""" already_approved = Approval.query.filter( Approval.review_queue_id == review_queue_id ).first() if already_approved: exception_util.raise_exception_for_ows_response( status=status.CONFLICT, code="exists", message=f'There is already an approval record for "review_queue_id: {review_queue_id}".', # noqa ) approval_data = { "review_queue_id": review_queue_id, "user_id": user_id or g.request_context.identity_id, "note": note, } if created_datetime: created_datetime_obj = datetime.fromisoformat(created_datetime) created_datetime_obj.replace(tzinfo=timezone.utc) approval_data.update(created_datetime=created_datetime_obj) db.session.add(Approval(**approval_data)) def delete(review_queue_id): """For integration testing purposes only, delete an approval.""" Approval.query.filter(Approval.review_queue_id == review_queue_id).delete()