Instantly share code, notes, and snippets.

@jtiai /address.py Secret
Created Jul 1, 2015

Embed
What would you like to do?
Q() magic
def _address_qs(streetname='', zipcode='', city='', exact=False):
streetname = streetname.strip()
zipcode = zipcode.strip()
city = city.strip().upper()
address_q = Q(address__usage__txt__in=(u'Asuinrakennus', u'Liike- tai teollisuusrakennus',
u'Loma-asuinrakennus', u'Muu tilapäinen asuminen',
u'Tontti', u'Omakotitalo', u'Kerrostalo', u'Rivitalo', u'Paritalo', u'Korjattu')) & Q(address__location__isnull=False)
if streetname:
sn_match = address_re.search(streetname)
if sn_match:
q_streetname = sn_match.group(1).strip().upper()
q_streetnumber = sn_match.group(2).strip().upper()
q_apartment_letter = sn_match.group(3).strip()
q_apartment_number = sn_match.group(4).strip()
q_apartment_division_letter = sn_match.group(5).strip()
else:
raise ValueError("ERROR: invalid streetname '%s'" % streetname)
address_sn_q = Q()
if exact:
if q_streetname:
address_q &= (Q(address__streetname_fi__exact=q_streetname) | Q(address__streetname_sv__exact=q_streetname))
if q_streetnumber:
address_sn_q &= Q(address__streetno__exact=q_streetnumber)
if not q_apartment_letter:
address_q &= Q(apartment_letter__isnull=True)
if not q_apartment_number:
address_q &= Q(apartment_number__isnull=True)
if not q_apartment_division_letter:
address_q &= Q(apartment_division_letter__isnull=True)
else:
if q_streetname:
address_q &= (Q(address__streetname_fi__startswith=q_streetname) | Q(address__streetname_sv__startswith=q_streetname))
if q_streetnumber:
address_sn_q &= Q(address__streetno__startswith=q_streetnumber)
if q_apartment_letter and q_apartment_number:
address_q &= Q(apartment_letter__iexact=q_apartment_letter)
if q_apartment_number:
address_q &= Q(apartment_number__iexact=q_apartment_number)
if q_apartment_division_letter:
address_q &= Q(apartment_division_letter__iexact=q_apartment_division_letter)
if not q_apartment_letter and q_streetnumber:
# Try additional magic
parts = re.split('([0-9]+)', q_streetnumber)
if len(parts) > 2:
address_sn_q |= (Q(address__streetno__iexact=parts[1]) &
Q(apartment_letter__iexact=parts[2]))
if q_apartment_letter and q_streetnumber and not q_apartment_number:
# Heuristics to solve STREET 999 A problem
address_sn_q = Q(address__streetno__iexact=u'%s%s' % (q_streetnumber, q_apartment_letter))
address_q &= address_sn_q
if zipcode:
address_q &= Q(address__zipcode=zipcode)
if city:
address_q &= (Q(address__city_fi__startswith=city) | Q(address__city_sv__startswith=city))
return address_q
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment