"""Rejection Notes Model.""" import datetime from oto import response from sqlalchemy import Column from sqlalchemy import DateTime from sqlalchemy import Enum from sqlalchemy import ForeignKey from sqlalchemy import Integer from sqlalchemy import String from product_workflow.connectors import mysql from product_workflow.models.release_approval_queue import ReleaseApprovalQueue class RejectionNote(mysql.BaseModel): """Model for rejection notes.""" __tablename__ = 'rejection_notes' rejection_id = Column( Integer, primary_key=True, autoincrement=True, nullable=False) release_approval_id = Column( Integer, ForeignKey('release_approval_queue.release_approval_id'), default=None ) table_name = Column(String, nullable=False) field_name = Column(String, nullable=True) comments = Column(String, nullable=True) corrected = Column(Enum('N', 'Y')) date_added = Column(DateTime, nullable=False) key_id = Column(Integer, nullable=True) def to_dict(self): """Format the properties of this rejection note object as a dict.""" return { 'rejection_id': self.rejection_id, 'table_name': self.table_name, 'field_name': self.field_name, 'comments': self.comments, 'corrected': self.corrected, 'key_id': self.key_id } @mysql.wrap_db_errors def get_rejection_notes(release_approval_id): """Get the most recent approval record for the given release.""" with mysql.db_session() as session: rejecton_notes = session.query(RejectionNote).filter_by( release_approval_id=release_approval_id).all() if not rejecton_notes: return response.Response(message={'items': []}) formatted_notes = [note.to_dict() for note in rejecton_notes] return response.Response(message={'items': formatted_notes}) @mysql.wrap_db_errors def update_rejection_notes(rejection_notes): """Update a collection of rejection notes.""" rejection_notes_updated = [] release_approval_ids = set() with mysql.db_session() as session: for rejection_note in rejection_notes: existing_rejection = session.query(RejectionNote).get( rejection_note.get('rejection_id')) if not existing_rejection: continue release_approval_ids.add(existing_rejection.release_approval_id) for prop_name in rejection_note: setattr( existing_rejection, prop_name, rejection_note.get(prop_name)) session.merge(existing_rejection) rejection_notes_updated.append(existing_rejection.to_dict()) for pk in release_approval_ids: existing_release_approval_queue = session.query( ReleaseApprovalQueue ).get(pk) existing_release_approval_queue.last_updated = \ datetime.datetime.now() return response.Response( status=200, message={'rejections': rejection_notes_updated})