"""Rejection Model.""" from datetime import datetime, timezone from flask import g from owsresponse import response, status from product_review.api import db from product_review.util import exception as exception_util class Rejection(db.Model): """Rejection model.""" __tablename__ = "rejection" rejection_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=False) will_not_deliver = db.Column( db.Boolean(create_constraint=True, name="ck_rejection_will_not_deliver"), default=0, ) def to_dict(self): """Return a dictionary of output properties.""" items = {} for c in self.__table__.columns: column_name = "rejection_id" if c.name == "id" else c.name items[column_name] = getattr(self, column_name) return items def format_for_workstation(self): """Return a dictionary of output properties. Formatted for consumption by ows-product-digital. """ return { "rejection_id": self.rejection_id, "table_name": "releases", "field_name": "general_comments", "comments": self.note, "corrected": "N", "key_id": 0, } def get_for_workstation(review_queue_id): """Get a rejection for the given release. The rejection is formatted as required by ows-product-digital. """ rejection = Rejection.query.filter_by(review_queue_id=review_queue_id).first() if not rejection: return response.Response(message={"items": []}) formatted_notes = rejection.format_for_workstation() return response.Response(message={"items": [formatted_notes]}) def reject( review_queue_id, note, will_not_deliver=False, user_id=None, created_datetime=None ): """Reject a product.""" already_rejected = Rejection.query.filter( Rejection.review_queue_id == review_queue_id ).first() if already_rejected: exception_util.raise_exception_for_ows_response( status=status.CONFLICT, code="exists", message=f'There is already a rejection record for "review_queue_id: {review_queue_id}".', # noqa ) rejection_data = { "review_queue_id": review_queue_id, "user_id": user_id or g.request_context.identity_id, "note": note, "will_not_deliver": will_not_deliver, } if created_datetime: created_datetime_obj = datetime.fromisoformat(created_datetime) created_datetime_obj.replace(tzinfo=timezone.utc) rejection_data.update(created_datetime=created_datetime_obj) db.session.add(Rejection(**rejection_data)) def delete(review_queue_id): """For integration testing purposes only, delete a rejection.""" Rejection.query.filter(Rejection.review_queue_id == review_queue_id).delete()