123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- """ Catalog utils """
- import logging
- from catalog.constants import (
- OUTSTATE, INSTATE, FOREIGN, MAINE, HANCOCK, UNITED_STATES, INCOUNTY)
- from catalog.models import ZipCode
- from django.contrib.localflavor.us.us_states import STATE_CHOICES
- LOG = logging.getLogger(__name__)
- def subscription_type(the_zip, state, country):
- """ For a zip code, looks up the state and country to determine the
- subscription type
- :returns: INCOUNTY, INSTATE, OUTSTATE, FOREIGN
- """
- LOG.debug("Subscription type: {0}, {1}, {2}".format(
- the_zip, state, country))
- if country == UNITED_STATES:
- try:
- zipcode = ZipCode.objects.get(zipcode=the_zip)
- if zipcode.county == HANCOCK:
- return INCOUNTY
- return _sub_by_state(zipcode.state)
- except ZipCode.DoesNotExist:
- return _sub_by_state(state)
- else:
- return FOREIGN
- def get_type(postal_code, region, country_code, postal_code2=None,
- region2=None, country_code2=None):
- """ get the type, only use the second address if there's values """
- if country_code2 and region2:
- shipping_type1 = subscription_type(postal_code, region, country_code)
- shipping_type2 = subscription_type(postal_code2, region2,
- country_code2)
- if _type_index(shipping_type1) > _type_index(shipping_type2):
- return shipping_type1
- else:
- return shipping_type2
- else:
- return subscription_type(postal_code, region, country_code)
- def get_type_by_profile(profile, shipping_type=None):
- """ For a profile, return the subscription type and first class option.
- type is In-State, Out of State, or Foreign
- first class is a boolean value, true if its an option
- """
- def _address_not_empty(address):
- """ is address not empty """
- return (address and address.postal_code and address.region and
- address.postal_code != '')
- if profile:
- shipping_type = subscription_type(profile.postal_code, profile.region,
- profile.country)
- address = profile.secondary_address
- if _address_not_empty(address):
- secondary_type = subscription_type(
- address.postal_code, address.region, address.country)
- if _type_index(secondary_type) > _type_index(shipping_type):
- shipping_type = secondary_type
- return shipping_type
- def _type_index(value):
- """ type index """
- return [INCOUNTY, INSTATE, OUTSTATE, FOREIGN].index(value)
- def _is_maine(state):
- """ Is the state maine? """
- return state.lower() == MAINE.lower()
- def _is_us_state(my_state):
- """ is a us state? """
- states = [state.lower() for state, state_string in STATE_CHOICES]
- return my_state.lower() in states
- def _sub_by_state(state):
- """ For a state, determines the subscription type
- :returns: INSTATE, OUTSTATE
- """
- if _is_maine(state):
- return INSTATE
- if _is_us_state(state):
- return OUTSTATE
|