def search(self, street, number=None, prefix=None, predir=None, suffix=None, postdir=None, city=None, state=None, zipcode=None): """ Searches the blocks for the given address bits. Returns a list of 2-tuples, (block, geocoded_pt). geocoded_pt will be None if number is None. We make these assumptions about the input: * Everything is already in all-uppercase * The predir and postdir have been standardized Note we don't enforce parity (even/odd) matching. So 3181 would match the block 3180-3188. """ filters = {'street': street.upper()} sided_filters = [] if predir: filters['predir'] = predir.upper() if prefix: filters['prefix'] = prefix.upper() if suffix: filters['suffix'] = suffix.upper() if postdir: filters['postdir'] = postdir.upper() if city: city_filter = Q(left_city=city.upper()) | Q(right_city=city.upper()) sided_filters.append(city_filter) if state: state_filter = Q(left_state=state.upper()) | Q(right_state=state.upper()) sided_filters.append(state_filter) if zipcode: zip_filter = Q(left_zip=zipcode) | Q(right_zip=zipcode) sided_filters.append(zip_filter) qs = self.filter(*sided_filters, **filters) # If a number was given, search against the address ranges in the # Block table. if number: number = int(re.sub(r'\D', '', number)) block_tuples = [] for block in qs.filter(from_num__lte=number, to_num__gte=number): contains, from_num, to_num = block.contains_number(number) if contains: block_tuples.append((block, from_num, to_num)) blocks = [] if block_tuples: from ebpub.utils.geodjango import interpolate for block, from_num, to_num in block_tuples: try: fraction = (float(number) - from_num) / (to_num - from_num) except ZeroDivisionError: fraction = 0.5 point = interpolate(block.geom, fraction, True) blocks.append((block, Point(*list(point.coords)))) else: blocks = list([(b, None) for b in qs]) return blocks
def forwards(self, orm): "Write your forwards methods here." alerts = orm['alerts.emailalert'].objects.all() for alert in alerts: if alert.block is not None: from ebpub.utils.geodjango import interpolate alert.block_center = interpolate(alert.block.geom, 0.5, True) alert.save()
def forwards(self, orm): "Write your forwards methods here." savedplaces = orm['savedplaces.savedplace'].objects.all() for sp in savedplaces: if sp.block is not None: from ebpub.utils.geodjango import interpolate sp.block_center = interpolate(sp.block.geom, 0.5, True) sp.save()