"""Model for the EUPointOfSaleByProductView.""" from collections import OrderedDict from sqlalchemy import Column, Date, Integer, String from sqlalchemy.ext.declarative import declarative_base from reporting import features from reporting.models import persister from reporting.utils.physical_reporting import ProductSharedFieldsMixin BaseModel = declarative_base() class EUPointOfSaleByProductView(ProductSharedFieldsMixin, BaseModel): """The EUPointOfSaleByProductView.""" __tablename__ = 'EU_POINT_OF_SALE_BY_PRODUCT_VIEW' upc_ean = Column( String(20), nullable=True, name='UPC/EAN', primary_key=True ) product_code = Column( String(20), nullable=True, name='Product Code', primary_key=True ) exclusive_for = Column(String(128), nullable=True, name='Exclusive For') orchard_price = Column(String(45), nullable=True, name='Orchard Price') wholesale_price = Column(Integer, nullable=True, name='Wholesale Price') first_day_of_release_week = Column( Date, nullable=False, name='First Day of Release Week', primary_key=True, ) weekly_scans = Column(Integer, nullable=False, name='Weekly Scans') all_time_scans = Column(Integer, nullable=False, name='All Time Scans') @staticmethod def _group_by(model_object): return getattr(model_object, 'upc_ean') @classmethod def all(cls, params): """Get all for EUPointOfSaleByProductView.""" filters = [ 'artist', 'first_day_of_release_week', 'product_name', 'product_type', 'release_date', 'sub_label', 'subacct_id', 'vendor_id', 'upc_ean', 'product_code', ] # order matters! order_by = [ 'vendor_id', 'subacct_id', 'upc_ean', 'product_code', 'first_day_of_release_week', ] return persister.get_all_point_of_sale_data( cls, params, filters, order_by, cls._group_by ) @classmethod def filter(cls, vendor_id, subacct_id): """Get filters for EUPointOfSaleByProductView.""" filter_data = [ {'column': 'Artist', 'alias': 'artist'}, {'column': 'Product Name', 'alias': 'product_name'}, {'column': 'Product Type', 'alias': 'product_type'}, {'column': 'Sub Label', 'alias': 'sub_label'}, {'column': 'UPC/EAN', 'alias': 'upc_ean'}, {'column': 'Product Code', 'alias': 'product_code'}, ] return persister.get_filter( cls.__tablename__, vendor_id, subacct_id, filter_data, filter_out_generic_products=False, ) @classmethod def headers(cls): """Get all headers.""" headers = [ 'Product Name', 'Artist', 'Label Name', 'Sub Label', 'Genre', 'Sub Genre', 'Product Code', 'UPC/EAN', 'Release Date', 'Product Type', 'Format', 'Units Per Set', 'Display Configuration', 'Exclusive', 'Exclusive For', 'Orchard Price', 'Wholesale Price', 'Scans by Weeks', 'Aggregated Scans', 'All Time Scans', ] if not features.is_point_of_sale_price_columns_enabled(): headers.remove('Orchard Price') headers.remove('Wholesale Price') return headers def to_dict(self): """To dictionary.""" data = OrderedDict() data['Product Name'] = self.product_name data['Artist'] = self.artist data['Label Name'] = self.label_name data['Sub Label'] = self.sub_label data['Genre'] = self.genre data['Sub Genre'] = self.sub_genre data['Product Code'] = self.product_code data['UPC/EAN'] = self.upc_ean try: data['Release Date'] = self.release_date.isoformat() except AttributeError: data['Release Date'] = '' data['Product Type'] = self.product_type data['Format'] = self.product_format data['Units Per Set'] = self.units_per_set data['Display Configuration'] = self.display_configuration data['Exclusive'] = self.exclusive data['Exclusive For'] = self.exclusive_for if features.is_point_of_sale_price_columns_enabled(): data['Orchard Price'] = self.orchard_price data['Wholesale Price'] = self.wholesale_price return data