Esempio n. 1
0
    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()
 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()