""" Product Split Model. Model for getting information about product split. """ from sqlalchemy import BigInteger, Column, Float, Integer, exc as sqlexeption from contracts import response from contracts.connectors import mysql from contracts.constants import contracts_constants from contracts.models import contract_history class ProductSplit(mysql.BaseModel): """ProductSplit class.""" __tablename__ = 'product_split' product_split_id = Column(Integer, primary_key=True) # noqa B001, B003 vendor_id = Column(Integer) product_id = Column(BigInteger) product_split_rate = Column(Float) def to_dict(self): """Get a dict representation.""" return {'upc': self.product_id, 'product_split': self.product_split_rate} def get_product_split(vendor_id, page_offset=None, page_limit=None): """Get a product split for provided vendor. Args: vendor_id (int): Vendor Id. Returns: response.Response: list of upcs and product_splits """ sort = ProductSplit.product_split_id with mysql.db_session() as session: query = ( session.query(ProductSplit) .filter(ProductSplit.vendor_id == vendor_id) .order_by(sort.desc()) ) paginated_query = query.offset(page_offset).limit(page_limit) result = [r.to_dict() for r in paginated_query.all()] session.expunge_all() result_data = { 'items': result, 'pagination': { 'type': 'standard', 'offset': page_offset, 'limit': page_limit, 'total_records': query.count(), }, } return response.Response(result_data) def set_product_split(data, vendor_id): """Set a product split for provided UPC. Args: data (list): a list of dictionaries vendor_id (int): Vendor_id Returns: response.Response: status """ with mysql.db_session() as session: for item in data: product_split = ProductSplit( product_id=item['upc'], product_split_rate=item['product_split_rate'], vendor_id=vendor_id, ) vendor_history = contract_history.set_product_change_history( contracts_constants.SET_PRODUCT_SPLIT_MESSAGE, item['upc'], item['vend_contract_id'], item['oa_user_id'], item['product_split_rate'], ) try: session.add(product_split) session.add(vendor_history) session.flush() except sqlexeption.IntegrityError: session.rollback() return response.create_error_response('Conflict', 'Duplicate UPC', 409) session.commit() return response.create_status_ok_response() def update_product_split(data): """Update a product split for provided UPC. Args: data (list): a list of dictionaries Returns: response.Response: status """ with mysql.db_session() as session: for item in data: row = ( session.query(ProductSplit) .filter(ProductSplit.product_id == item['upc']) .first() ) if not row: return response.create_not_found_response( item['upc'].join(['UPC: ', ' not found']) ) row.product_split_rate = item['product_split_rate'] vendor_history = contract_history.set_product_change_history( contracts_constants.UPDATE_PRODUCT_SPLIT_MESSAGE, item['upc'], item['vend_contract_id'], item['oa_user_id'], item['product_split_rate'], ) session.add(vendor_history) session.flush() session.commit() return response.create_status_ok_response() def delete_product_split(upc, data): """Delete a product split for provided UPC. Args: upc (int): UPC. Returns: response.Response: status """ with mysql.db_session() as session: row = session.query(ProductSplit).filter(ProductSplit.product_id == upc).first() if not row: return response.create_not_found_response(upc.join(['UPC: ', ' not found'])) session.delete(row) vendor_history = contract_history.set_product_change_history( contracts_constants.DELETE_PRODUCT_SPLIT_MESSAGE, upc, data['vend_contract_id'], data['oa_user_id'], ) session.add(vendor_history) session.commit() return response.create_status_ok_response()