예제 #1
0
def display_report(report, format):
    report = CadorsReport.query.get_or_404(report)

    if format == 'atom':
        reports = process_report_atom([report])
        feed_timestamp = generate(report.last_updated, accept_naive=True)
        response = make_response(
            render_template('feed.xml',
                            reports=reports,
                            feed_timestamp=feed_timestamp))
        response.mimetype = "application/atom+xml"
    elif format == 'json':
        response = make_response(json.dumps(
                {'report': report},
                indent=None if request.is_xhr else 2,
                default=json_default))
        response.mimetype = "application/json"
    elif format == 'html':
        response = make_response(
            render_template('single_report.html',
                            report=report))
    elif format == 'kml':
        response = make_response(render_template('kml.xml', report=report))
        response.mimetype = "application/vnd.google-earth.kml+xml"
        
    response.last_modified = report.last_updated
    return prepare_response(response, 43200)
예제 #2
0
def display_categories():
    categories = ReportCategory.query
    categories = categories.add_column(
        select(
            [func.count()],
            category_map.c.category_id == \
                ReportCategory.category_id).select_from(
                    category_map).label('report_count'))

    categories = categories.order_by('report_count DESC',
                                     ReportCategory.text.asc()).all()

    response = make_response(render_template('category_list.html',
                                             categories=categories))
    
    return prepare_response(response, 3600)
예제 #3
0
def do_input(year, month, day):
    try:
        ts = datetime(year, month, day)
    except ValueError:
        abort(400)

    daily_report = DailyReport.query.filter(
        DailyReport.report_date == ts).first_or_404()

    filename = "report-%04d%02d%02d.html" % (year, month, day)

    response = make_response(unicode(daily_report.report_html,
                                     'utf-8'))
    response.mimetype = 'text/html'
    response.headers['Content-disposition'] = "attachment; filename=%s" % (filename)
    return prepare_response(response, 43200)
예제 #4
0
def daily_reports_list(page):
    query = DailyReport.query
    query = query.add_column(
        select(
            [func.count()],
            report_map.c.daily_report_id == \
                DailyReport.daily_report_id).select_from(
                    report_map).label('report_count'))
    

    pagination = query.paginate(page)

    response = make_response(render_template('daily_report_list.html',
                           daily_reports=pagination.items,
                           pagination=pagination))
    
    return prepare_response(response, 3600)
예제 #5
0
def search_location():
    latitude = request.args['latitude']
    longitude = request.args['longitude']
    radius = int(request.args['radius'])
    primary = True if (request.args['primary'] == 'primary') else False
    page = int(request.args.get('page', '1'))
    format = request.args.get('format', 'html')

    radius_m = radius * 1000

    wkt = "POINT(%s %s)" % (longitude, latitude)
    location = WKTSpatialElement(wkt)

    loc = sql.cast(LocationBase.location, Geography)
    q_loc = sql.cast(location, Geography)

    query = CadorsReport.query.join(LocationRef).join(LocationBase).filter(
        functions.within_distance(loc, q_loc, radius_m))

    if primary:
        query = query.filter(LocationRef.primary == True)

    if format == 'html':
        query = query.add_column(functions.distance(loc, q_loc).label('distance'))
        query = query.add_column(
            func.ST_Azimuth(location,
                            LocationBase.location.RAW) * (180/func.pi()))
        query = query.add_column(LocationBase.name)
        query = query.order_by('distance ASC',
                               CadorsReport.timestamp.desc())
        pagination = query.paginate(page)

        response = make_response(
            render_template('sr_loc.html',
                            reports=pagination.items, pagination=pagination,
                            get_direction=get_direction, radius=radius,
                            latitude=latitude, longitude=longitude))
        return prepare_response(response, 300)
    else:
        pagination = query.paginate(page)
        title = "Events within %s km of %s, %s" % (radius, latitude,
                                                   longitude)
        return render_list(pagination, title, format)
예제 #6
0
def daily_report_full(year, month, day):
    try:
        ts = datetime(year, month, day)
    except ValueError:
        abort(400)

    daily_report = DailyReport.query.filter(
        DailyReport.report_date == ts).first_or_404()

    reports = CadorsReport.query.with_parent(daily_report)

    report_date = daily_report.report_date.strftime("%Y-%m-%d")

    title = "Report details for %s" % (report_date)

    if 'type' in request.args:
        report_type = request.args['type']
        reports = reports.filter(
            CadorsReport.occurrence_type==report_type)
        title = "%s reports for %s" % (report_type, report_date)
    if 'region' in request.args:
        region = request.args['region']
        reports = reports.filter(
            CadorsReport.region==region)
        title = "Reports in %s for %s" % (region, report_date)

    reports = reports.all()

    response = make_response(
        render_template('daily_report_full.html',
                        daily_report=daily_report,
                        reports=reports,
                        title=title))

    response.last_modified = daily_report.last_updated
    return prepare_response(response, 43200)
예제 #7
0
def search_text():
    terms = request.args['q']
    page = int(request.args.get('page', '1'))
    format = request.args.get('format', 'html')

    query = CadorsReport.query.filter(
        'cadors_report.narrative_agg_idx_col @@ plainto_tsquery(:terms)')

    query = query.params(terms=terms)
    query = query.order_by(
        'ts_rank_cd(narrative_agg_idx_col, plainto_tsquery(:terms)) DESC',
        CadorsReport.timestamp.desc())

    if format == 'html':
        query = query.add_column(
            func.ts_headline('pg_catalog.english',
                             CadorsReport.narrative_agg,
                             func.plainto_tsquery(terms),
                             '''MaxFragments=2,
                            MinWords=15,
                            MaxWords=20,
                            FragmentDelimiter=|||,
                            StartSel="<b>",
                            StopSel = "</b>"''',
                             type_=types.Unicode))
        pagination = query.paginate(page)

        response = make_response(
            render_template('sr_text.html', reports=pagination.items,
                            pagination=pagination, terms=terms))

        return prepare_response(response, 300)
    else:
        pagination = query.paginate(page)
        title = "Results for '%s'" % (terms)
        return render_list(pagination, title, format)
예제 #8
0
def do_daily_report(year, month, day, format):
    try:
        ts = datetime(year, month, day)
    except ValueError:
        abort(400)

    daily_report = DailyReport.query.filter(
        DailyReport.report_date == ts).first_or_404()


    navlinks = make_navlinks(daily_report)

    if format == 'atom':
        reports = process_report_atom(daily_report.reports)
        feed_timestamp = generate(daily_report.last_updated, accept_naive=True)
        title = "Daily Report for %s" % ts.strftime("%Y-%m-%d")
        
        first=navlinks['first'].link(format='atom', _external=True)
        prev=navlinks['prev'].link(format='atom', _external=True) \
            if navlinks['prev'] is not None else None
        next=navlinks['next'].link(format='atom', _external=True) \
            if navlinks['next'] is not None else None
        last=navlinks['last'].link(format='atom', _external=True)

        response = make_response(
            render_template('feed.xml',
                            feed_timestamp=feed_timestamp,
                            reports=reports,
                            title=title,
                            first=first, next=next, prev=prev, last=last)) 
        response.mimetype = "application/atom+xml"
    elif format == 'html':
        occurrence_type = CadorsReport.occurrence_type
        type_count = func.count(CadorsReport.region)

        types = db.session.query(occurrence_type, type_count).group_by(
            occurrence_type).with_parent(
            daily_report).order_by(type_count.desc()).all()

        region = CadorsReport.region
        region_count = func.count(CadorsReport.region)

        regions = db.session.query(region, region_count).group_by(
            region).with_parent(
            daily_report).order_by(region_count.desc()).all()

        response = make_response(
            render_template('daily_report.html',
                            daily_report=daily_report,
                            reports=daily_report.reports,
                            types=types,
                            regions=regions,
                            **navlinks))
    elif format == 'json':
        response = make_response(json.dumps(
                {'reports': daily_report.reports},
                indent=None if request.is_xhr else 2,
                default=json_default))
        response.mimetype = "application/json"

    response.last_modified = daily_report.last_updated
    return prepare_response(response, 43200)