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