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
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")
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)