Example #1
0
def email_for_subscription(alert, start_date, frequency):
    """
    Returns a (place_name, text, html) tuple for the given EmailAlert
    object and date.
    """
    start_datetime = datetime.datetime(start_date.year, start_date.month, start_date.day)
    yesterday = datetime.date.today() - datetime.timedelta(days=1)
    end_datetime = datetime.datetime.combine(yesterday, datetime.time(23, 59, 59, 9999)) # the end of yesterday
    # Order by schema__id to group schemas together.
    qs = NewsItem.objects.select_related().filter(schema__is_public=True, pub_date__range=(start_datetime, end_datetime)).order_by('-schema__importance', 'schema__id')
    if alert.include_new_schemas:
        if alert.schemas:
            qs = qs.exclude(schema__id__in=alert.schemas.split(','))
    else:
        if alert.schemas:
            qs = qs.filter(schema__id__in=alert.schemas.split(','))
    if alert.block:
        place_name, place_url = alert.block.pretty_name, alert.block.url()
        place = alert.block
        search_buffer = make_search_buffer(alert.block.location.centroid, alert.radius)
        qs = qs.filter(location__bboverlaps=search_buffer)
    elif alert.location:
        place_name, place_url = alert.location.name, alert.location.url()
        place = alert.location
        qs = qs.filter(newsitemlocation__location__id=alert.location.id)
    ni_list = list(qs)
    if not ni_list:
        raise NoNews
    schemas_used = set([ni.schema for ni in ni_list])
    populate_attributes_if_needed(ni_list, list(schemas_used))
    text, html = email_text_for_place(alert, place, place_name, place_url, ni_list, start_date, frequency)
    return place_name, text, html
Example #2
0
def email_for_subscription(alert, start_date, frequency):
    """
    Returns a (place_name, text, html) tuple for the given EmailAlert
    object and date.
    """
    start_datetime = datetime.datetime(start_date.year, start_date.month, start_date.day)
    yesterday = datetime.date.today() - datetime.timedelta(days=1)
    end_datetime = datetime.datetime.combine(yesterday, datetime.time(23, 59, 59, 9999)) # the end of yesterday
    # Order by schema__id to group schemas together.
    qs = NewsItem.objects.select_related().filter(schema__is_public=True, pub_date__range=(start_datetime, end_datetime)).order_by('-schema__importance', 'schema__id')
    if alert.include_new_schemas:
        if alert.schemas:
            qs = qs.exclude(schema__id__in=alert.schemas.split(','))
    else:
        if alert.schemas:
            qs = qs.filter(schema__id__in=alert.schemas.split(','))
    if alert.block:
        place_name, place_url = alert.block.pretty_name, alert.block.url()
        place = alert.block
        search_buffer = make_search_buffer(alert.block.location.centroid, alert.radius)
        qs = qs.filter(location__bboverlaps=search_buffer)
    elif alert.location:
        place_name, place_url = alert.location.name, alert.location.url()
        place = alert.location
        qs = qs.filter(newsitemlocation__location__id=alert.location.id)
    ni_list = list(qs)
    if not ni_list:
        raise NoNews
    schemas_used = set([ni.schema for ni in ni_list])
    populate_attributes_if_needed(ni_list, list(schemas_used))
    text, html = email_text_for_place(alert, place, place_name, place_url, ni_list, start_date, frequency)
    return place_name, text, html
Example #3
0
def newsitems_geojson(request):
    # Copy-pasted code from ajax_place_newsitems.  Refactoring target:
    # Seems like there are a number of similar code blocks in
    # ebpub.db.views?

    pid = request.GET.get("pid", "")

    if pid:
        place, block_radius, xy_radius = parse_pid(pid)
        if isinstance(place, Block):
            search_buffer = make_search_buffer(place.location.centroid, block_radius)
            newsitem_qs = NewsItem.objects.filter(location__bboverlaps=search_buffer)
        else:
            # This depends on the trigger in newsitemlocation.sql
            newsitem_qs = NewsItem.objects.filter(newsitemlocation__location__id=place.id)
    else:
        # Whole city!
        newsitem_qs = NewsItem.objects.all()

    # Ordering by schema__id is an optimization for map_popups()
    newsitem_list = list(newsitem_qs.select_related().order_by("schema__id"))
    popup_list = map_popups(newsitem_list)

    features = {"type": "FeatureCollection", "features": []}
    for newsitem, popup_info in zip(newsitem_list, popup_list):
        if newsitem.location is None:
            # Can happen, see NewsItem docstring.
            # TODO: We should probably allow for newsitems that have a
            # location_object too?
            continue

        features["features"].append(
            {
                "type": "Feature",
                "geometry": {
                    "type": "Point",
                    "coordinates": [newsitem.location.centroid.x, newsitem.location.centroid.y],
                },
                "properties": {
                    "title": newsitem.title,
                    "id": popup_info[0],
                    "popup_html": popup_info[1],
                    "schema": popup_info[2],
                },
            }
        )
    output = simplejson.dumps(features, indent=2)
    return HttpResponse(output, mimetype="application/javascript")
Example #4
0
 def newsitems_for_obj(self, obj, qs, block_radius):
     search_buffer = make_search_buffer(obj.location.centroid, block_radius)
     return qs.filter(location__bboverlaps=search_buffer)
Example #5
0
 def newsitems_for_obj(self, obj, qs, block_radius):
     search_buffer = make_search_buffer(obj.location.centroid, block_radius)
     return qs.filter(location__bboverlaps=search_buffer)