"""Store Pricing Tier Code Territory. This model represents a Store Pricing Tier Code Territory """ import datetime from oto import response from pricing.connectors import mysql import sqlalchemy class StorePricingTierCodeTerritory(mysql.BaseModel): """Store Pricing Tier Code Territory model.""" __tablename__ = 'store_pricing_tier_code_territory' store_pricing_tier_code_id = sqlalchemy.Column( sqlalchemy.BIGINT, primary_key=True) territory_code = sqlalchemy.Column( sqlalchemy.VARCHAR(45), primary_key=True) created_date = sqlalchemy.Column(sqlalchemy.DateTime) created_by = sqlalchemy.Column(sqlalchemy.VARCHAR(45)) updated_date = sqlalchemy.Column(sqlalchemy.DateTime) updated_by = sqlalchemy.Column(sqlalchemy.VARCHAR(45)) def to_dict(self): """Convert a Store Pricing Tier Code Territory to dict.""" return dict( store_pricing_tier_code_id=self.store_pricing_tier_code_id, territory_code=self.territory_code) @mysql.autosession() def get_by_store_pricing_tier_code_id(store_pricing_tier_code_id, session): """Return the store pricing tier code territories for a tier code ID. Args: store_pricing_tier_code_id (int): the ID of the pricing tier code. session (Session): the mysql session. Returns: response.Response: containing a list of tier code territory dicts. """ store_pricing_tier_code_territories = _get_by_store_pricing_tier_code_id( store_pricing_tier_code_id, session ) return response.Response( { 'items': store_pricing_tier_code_territories }) def _get_by_store_pricing_tier_code_id(store_pricing_tier_code_id, session): territories = session.query(StorePricingTierCodeTerritory).filter_by( store_pricing_tier_code_id=store_pricing_tier_code_id).all() return [item.to_dict() for item in territories] @mysql.autosession() def create(store_pricing_tier_code_id, territory_code, session): """Create a new store pricing tier code territory. Args: store_pricing_tier_code_id (int): the ID of the parent code. territory_code (string): the territory code. session (Session): the mysql session. Returns: response.Response: containing the created store pricing tier code territory dict. """ result = _create(store_pricing_tier_code_id, territory_code, session) session.commit() return result def _create(store_pricing_tier_code_id, territory_code, session): """Create a new store pricing tier code territory. Args: store_pricing_tier_code_id (int): the ID of the parent code. territory_code (string): the territory code. session (Session): the mysql session. Returns: response.Response: containing the created store pricing tier code territory dict. """ data = { 'store_pricing_tier_code_id': store_pricing_tier_code_id, 'territory_code': territory_code, 'created_date': datetime.datetime.now() } store_pricing_tier_code_territory = StorePricingTierCodeTerritory(**data) session.add(store_pricing_tier_code_territory) return response.Response(store_pricing_tier_code_territory.to_dict()) @mysql.autosession() def delete(store_pricing_tier_code_id, territory_code, session): """Delete a store pricing tier code territory. Args: store_pricing_tier_code_id (int): the ID of the parent code. territory_code (string): the territory code. session (Session): the mysql session. Returns: response.Response: containing the deleted store pricing tier code territory dict. """ result = _delete(store_pricing_tier_code_id, territory_code, session) session.commit() return result def _delete(store_pricing_tier_code_id, territory_code, session): """Delete a store pricing tier code territory. Args: store_pricing_tier_code_id (int): the ID of the parent code. territory_code (string): the territory code. session (Session): the mysql session. Returns: response.Response: containing the deleted store pricing tier code territory dict. """ instance = session.query(StorePricingTierCodeTerritory).filter_by( store_pricing_tier_code_id=store_pricing_tier_code_id, territory_code=territory_code).one_or_none() if not instance: return response.create_not_found_response() session.delete(instance) return response.Response(instance.to_dict()) @mysql.autosession() def delete_by_store_pricing_tier_code_id(store_pricing_tier_code_id, session): """Delete store pricing tier code territories by store pricing tier code id. Args: store_pricing_tier_code_id (int): the ID of the store pricing tier code session (Session): the mysql session Returns: response.Response: containing the deleted store pricing tier code territories dict. """ items_to_delete = session.query(StorePricingTierCodeTerritory).filter_by( store_pricing_tier_code_id=store_pricing_tier_code_id).all() for item in items_to_delete: session.delete(item) session.commit() return response.Response() @mysql.autosession() def update_territories(store_pricing_tier_code_id, territory_codes, session): """Create or delete store pricing tier code territories. Args: store_pricing_tier_code_id (int): the ID of the parent code. territory_codes ([string]): a list of territory codes. session (Session): the mysql session. Returns: response.Response: containing the list of created and deleted store pricing tier code territories. """ existing_territories = _get_by_store_pricing_tier_code_id( store_pricing_tier_code_id, session) existing_territory_codes = [item['territory_code'] for item in existing_territories] create_new_territory_codes = list(set( territory_codes) - set(existing_territory_codes)) delete_old_territory_codes = list(set( existing_territory_codes) - set(territory_codes)) created = [] deleted = [] for territory_code in create_new_territory_codes: create_result = _create( store_pricing_tier_code_id, territory_code, session) created.append(create_result.message) for territory_code in delete_old_territory_codes: delete_result = _delete( store_pricing_tier_code_id, territory_code, session) deleted.append(delete_result.message) session.commit() return response.Response({ 'created': created, 'deleted': deleted})