<s> import re <EOL> import zlib <EOL> from django . conf import settings <EOL> from django . core import exceptions <EOL> from django . db import models <EOL> from django . utils . encoding import python_2_unicode_compatible <EOL> from django . utils . six . moves import filter <EOL> from django . utils . translation import ugettext_lazy as _ <EOL> from django . utils . translation import pgettext_lazy <EOL> from oscar . core . compat import AUTH_USER_MODEL <EOL> from oscar . models . fields import PhoneNumberField , UppercaseCharField <EOL> @ python_2_unicode_compatible <EOL> class AbstractAddress ( models . Model ) : <EOL> """<STR_LIT>""" <EOL> MR , MISS , MRS , MS , DR = ( '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' ) <EOL> TITLE_CHOICES = ( <EOL> ( MR , _ ( "<STR_LIT>" ) ) , <EOL> ( MISS , _ ( "<STR_LIT>" ) ) , <EOL> ( MRS , _ ( "<STR_LIT>" ) ) , <EOL> ( MS , _ ( "<STR_LIT>" ) ) , <EOL> ( DR , _ ( "<STR_LIT>" ) ) , <EOL> ) <EOL> POSTCODE_REQUIRED = '<STR_LIT>' in settings . OSCAR_REQUIRED_ADDRESS_FIELDS <EOL> POSTCODES_REGEX = { <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> '<STR_LIT>' : r'<STR_LIT>' , <EOL> } <EOL> title = models . CharField ( <EOL> pgettext_lazy ( u"<STR_LIT>" , u"<STR_LIT>" ) , <EOL> max_length = <NUM_LIT:64> , choices = TITLE_CHOICES , blank = True ) <EOL> first_name = models . CharField ( _ ( "<STR_LIT>" ) , max_length = <NUM_LIT:255> , blank = True ) <EOL> last_name = models . CharField ( _ ( "<STR_LIT>" ) , max_length = <NUM_LIT:255> , blank = True ) <EOL> line1 = models . CharField ( _ ( "<STR_LIT>" ) , max_length = <NUM_LIT:255> ) <EOL> line2 = models . CharField ( <EOL> _ ( "<STR_LIT>" ) , max_length = <NUM_LIT:255> , blank = True ) <EOL> line3 = models . CharField ( <EOL> _ ( "<STR_LIT>" ) , max_length = <NUM_LIT:255> , blank = True ) <EOL> line4 = models . CharField ( _ ( "<STR_LIT>" ) , max_length = <NUM_LIT:255> , blank = True ) <EOL> state = models . CharField ( _ ( "<STR_LIT>" ) , max_length = <NUM_LIT:255> , blank = True ) <EOL> postcode = UppercaseCharField ( <EOL> _ ( "<STR_LIT>" ) , max_length = <NUM_LIT:64> , blank = True ) <EOL> country = models . ForeignKey ( '<STR_LIT>' , verbose_name = _ ( "<STR_LIT>" ) ) <EOL> search_text = models . TextField ( <EOL> _ ( "<STR_LIT>" ) , editable = False ) <EOL> def __str__ ( self ) : <EOL> return self . summary <EOL> class Meta : <EOL> abstract = True <EOL> verbose_name = _ ( '<STR_LIT>' ) <EOL> verbose_name_plural = _ ( '<STR_LIT>' ) <EOL> def save ( self , * args , ** kwargs ) : <EOL> self . _update_search_text ( ) <EOL> super ( AbstractAddress , self ) . save ( * args , ** kwargs ) <EOL> def clean ( self ) : <EOL> for field in [ '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , <EOL> '<STR_LIT>' , '<STR_LIT:state>' , '<STR_LIT>' ] : <EOL> if self . __dict__ [ field ] : <EOL> self . __dict__ [ field ] = self . __dict__ [ field ] . strip ( ) <EOL> self . ensure_postcode_is_valid_for_country ( ) <EOL> def ensure_postcode_is_valid_for_country ( self ) : <EOL> """<STR_LIT>""" <EOL> if not self . postcode and self . POSTCODE_REQUIRED and self . country_id : <EOL> country_code = self . country . iso_3166_1_a2 <EOL> regex = self . POSTCODES_REGEX . get ( country_code , None ) <EOL> if regex : <EOL> msg = _ ( "<STR_LIT>" ) % { '<STR_LIT>' : self . country } <EOL> raise exceptions . ValidationError ( msg ) <EOL> if self . postcode and self . country_id : <EOL> postcode = self . postcode . upper ( ) . replace ( '<STR_LIT:U+0020>' , '<STR_LIT>' ) <EOL> country_code = self . country . iso_3166_1_a2 <EOL> regex = self . POSTCODES_REGEX . get ( country_code , None ) <EOL> if regex and not re . match ( regex , postcode ) : <EOL> msg = _ ( "<STR_LIT>" <EOL> "<STR_LIT>" ) % { '<STR_LIT>' : self . postcode , <EOL> '<STR_LIT>' : self . country } <EOL> raise exceptions . ValidationError ( <EOL> { '<STR_LIT>' : [ msg ] } ) <EOL> def _update_search_text ( self ) : <EOL> search_fields = filter ( <EOL> bool , [ self . first_name , self . last_name , <EOL> self . line1 , self . line2 , self . line3 , self . line4 , <EOL> self . state , self . postcode , self . country . name ] ) <EOL> self . search_text = '<STR_LIT:U+0020>' . join ( search_fields ) <EOL> @ property <EOL> def city ( self ) : <EOL> return self . line4 <EOL> @ property <EOL> def summary ( self ) : <EOL> """<STR_LIT>""" <EOL> return u"<STR_LIT:U+002CU+0020>" . join ( self . active_address_fields ( ) ) <EOL> @ property <EOL> def salutation ( self ) : <EOL> """<STR_LIT>""" <EOL> return self . join_fields ( <EOL> ( '<STR_LIT:title>' , '<STR_LIT>' , '<STR_LIT>' ) , <EOL> separator = u"<STR_LIT:U+0020>" ) <EOL> @ property <EOL> def name ( self ) : <EOL> return self . join_fields ( ( '<STR_LIT>' , '<STR_LIT>' ) , separator = u"<STR_LIT:U+0020>" ) <EOL> def generate_hash ( self ) : <EOL> """<STR_LIT>""" <EOL> return zlib . crc32 ( self . summary . strip ( ) . upper ( ) . encode ( '<STR_LIT>' ) ) <EOL> def join_fields ( self , fields , separator = u"<STR_LIT:U+002CU+0020>" ) : <EOL> """<STR_LIT>""" <EOL> field_values = [ ] <EOL> for field in fields : <EOL> if field == '<STR_LIT:title>' : <EOL> value = self . get_title_display ( ) <EOL> else : <EOL> value = getattr ( self , field ) <EOL> field_values . append ( value ) <EOL> return separator . join ( filter ( bool , field_values ) ) <EOL> def populate_alternative_model ( self , address_model ) : <EOL> """<STR_LIT>""" <EOL> destination_field_names = [ <EOL> field . name for field in address_model . _meta . fields ] <EOL> for field_name in [ field . name for field in self . _meta . fields ] : <EOL> if field_name in destination_field_names and field_name != '<STR_LIT:id>' : <EOL> setattr ( address_model , field_name , getattr ( self , field_name ) ) <EOL> def active_address_fields ( self , include_salutation = True ) : <EOL> """<STR_LIT>""" <EOL> fields = [ self . line1 , self . line2 , self . line3 , <EOL> self . line4 , self . state , self . postcode ] <EOL> if include_salutation : <EOL> fields = [ self . salutation ] + fields <EOL> fields = [ f . strip ( ) for f in fields if f ] <EOL> try : <EOL> fields . append ( self . country . printable_name ) <EOL> except exceptions . ObjectDoesNotExist : <EOL> pass <EOL> return fields <EOL> @ python_2_unicode_compatible <EOL> class AbstractCountry ( models . Model ) : <EOL> """<STR_LIT>""" <EOL> iso_3166_1_a2 = models . CharField ( <EOL> _ ( '<STR_LIT>' ) , max_length = <NUM_LIT:2> , primary_key = True ) <EOL> iso_3166_1_a3 = models . CharField ( <EOL> _ ( '<STR_LIT>' ) , max_length = <NUM_LIT:3> , blank = True ) <EOL> iso_3166_1_numeric = models . CharField ( <EOL> _ ( '<STR_LIT>' ) , blank = True , max_length = <NUM_LIT:3> ) <EOL> printable_name = models . CharField ( _ ( '<STR_LIT>' ) , max_length = <NUM_LIT> ) <EOL> name = models . CharField ( _ ( '<STR_LIT>' ) , max_length = <NUM_LIT> ) <EOL> display_order = models . PositiveSmallIntegerField ( <EOL> _ ( "<STR_LIT>" ) , default = <NUM_LIT:0> , db_index = True , <EOL> help_text = _ ( '<STR_LIT>' ) ) <EOL> is_shipping_country = models . BooleanField ( <EOL> _ ( "<STR_LIT>" ) , default = False , db_index = True ) <EOL> class Meta : <EOL> abstract = True <EOL> app_label = '<STR_LIT:address>' <EOL> verbose_name = _ ( '<STR_LIT>' ) <EOL> verbose_name_plural = _ ( '<STR_LIT>' ) <EOL> ordering = ( '<STR_LIT>' , '<STR_LIT>' , ) <EOL> def __str__ ( self ) : <EOL> return self . printable_name or self . name <EOL> @ property <EOL> def code ( self ) : <EOL> """<STR_LIT>""" <EOL> return self . iso_3166_1_a2 <EOL> @ property <EOL> def numeric_code ( self ) : <EOL> """<STR_LIT>""" <EOL> return u"<STR_LIT>" % int ( self . iso_3166_1_numeric ) <EOL> class AbstractShippingAddress ( AbstractAddress ) : <EOL> """<STR_LIT>""" <EOL> phone_number = PhoneNumberField ( <EOL> _ ( "<STR_LIT>" ) , blank = True , <EOL> help_text = _ ( "<STR_LIT>" ) ) <EOL> notes = models . TextField ( <EOL> blank = True , verbose_name = _ ( '<STR_LIT>' ) , <EOL> help_text = _ ( "<STR_LIT>" <EOL> "<STR_LIT>" ) ) <EOL> class Meta : <EOL> abstract = True <EOL> app_label = '<STR_LIT>' <EOL> verbose_name = _ ( "<STR_LIT>" ) <EOL> verbose_name_plural = _ ( "<STR_LIT>" ) <EOL> @ property <EOL> def order ( self ) : <EOL> """<STR_LIT>""" <EOL> try : <EOL> return self . order_set . all ( ) [ <NUM_LIT:0> ] <EOL> except IndexError : <EOL> return None <EOL> class AbstractUserAddress ( AbstractShippingAddress ) : <EOL> """<STR_LIT>""" <EOL> user = models . ForeignKey ( <EOL> AUTH_USER_MODEL , related_name = '<STR_LIT>' , verbose_name = _ ( "<STR_LIT>" ) ) <EOL> is_default_for_shipping = models . BooleanField ( <EOL> _ ( "<STR_LIT>" ) , default = False ) <EOL> is_default_for_billing = models . BooleanField ( <EOL> _ ( "<STR_LIT>" ) , default = False ) <EOL> num_orders = models . PositiveIntegerField ( _ ( "<STR_LIT>" ) , default = <NUM_LIT:0> ) <EOL> hash = models . CharField ( _ ( "<STR_LIT>" ) , max_length = <NUM_LIT:255> , db_index = True , <EOL> editable = False ) <EOL> date_created = models . DateTimeField ( _ ( "<STR_LIT>" ) , auto_now_add = True ) <EOL> def save ( self , * args , ** kwargs ) : <EOL> """<STR_LIT>""" <EOL> self . hash = self . generate_hash ( ) <EOL> self . _ensure_defaults_integrity ( ) <EOL> super ( AbstractUserAddress , self ) . save ( * args , ** kwargs ) <EOL> def _ensure_defaults_integrity ( self ) : <EOL> if self . is_default_for_shipping : <EOL> self . __class__ . _default_manager . filter ( user = self . user , is_default_for_shipping = True ) . update ( is_default_for_shipping = False ) <EOL> if self . is_default_for_billing : <EOL> self . __class__ . _default_manager . filter ( user = self . user , is_default_for_billing = True ) . update ( is_default_for_billing = False ) <EOL> class Meta : <EOL> abstract = True <EOL> app_label = '<STR_LIT:address>' <EOL> verbose_name = _ ( "<STR_LIT>" ) <EOL> verbose_name_plural = _ ( "<STR_LIT>" ) <EOL> ordering = [ '<STR_LIT>' ] <EOL> unique_together = ( '<STR_LIT:user>' , '<STR_LIT>' ) <EOL> def validate_unique ( self , exclude = None ) : <EOL> super ( AbstractAddress , self ) . validate_unique ( exclude ) <EOL> qs = self . __class__ . objects . filter ( <EOL> user = self . user , <EOL> hash = self . generate_hash ( ) ) <EOL> if self . id : <EOL> qs = qs . exclude ( id = self . id ) <EOL> if qs . exists ( ) : <EOL> raise exceptions . ValidationError ( { <EOL> '<STR_LIT>' : [ _ ( "<STR_LIT>" <EOL> "<STR_LIT>" ) ] } ) <EOL> class AbstractBillingAddress ( AbstractAddress ) : <EOL> class Meta : <EOL> abstract = True <EOL> app_label = '<STR_LIT>' <EOL> verbose_name = _ ( "<STR_LIT>" ) <EOL> verbose_name_plural = _ ( "<STR_LIT>" ) <EOL> @ property <EOL> def order ( self ) : <EOL> """<STR_LIT>""" <EOL> try : <EOL> return self . order_set . all ( ) [ <NUM_LIT:0> ] <EOL> except IndexError : <EOL> return None <EOL> class AbstractPartnerAddress ( AbstractAddress ) : <EOL> """<STR_LIT>""" <EOL> partner = models . ForeignKey ( '<STR_LIT>' , related_name = '<STR_LIT>' , <EOL> verbose_name = _ ( '<STR_LIT>' ) ) <EOL> class Meta : <EOL> abstract = True <EOL> app_label = '<STR_LIT>' <EOL> verbose_name = _ ( "<STR_LIT>" ) <EOL> verbose_name_plural = _ ( "<STR_LIT>" ) </s>
