import csv import pywapi from datetime import datetime, date, timedelta from dateutil.relativedelta import relativedelta from dateutil.parser import parse from django import http from django.template.loader import get_template from django.template import Context import ho.pisa as pisa import cStringIO as StringIO import cgi from django.http import HttpResponse from django.template.context import RequestContext from django.views.generic import list_detail from django.shortcuts import render_to_response from almanac.models import ( Tide, TideDay, TideChart, Day, WeatherConditions, WeatherAlert, WeatherForecast, ) from darkroom.models import Webcam from directory.models import Place, Point, Town def index(request): webcams = Webcam.objects.all() towns = Town.objects.filter(in_coverage=True) town_weather = [] for t in towns: if t.slug == "castine" or t.slug == "stonington" or t.slug == "blue-hill": town_weather.append(pywapi.get_weather_from_yahoo(t.zipcode, "imperial")) if datetime.now().hour > 20 or datetime.now().hour < 4: moon = "moon" else: moon = "" return render_to_response( "almanac/index.html", locals(), context_instance=RequestContext(request) ) def tide_index(request): charts = TideChart.objects.filter(public=True).order_by("-year") months = [ "jan", "feb", "mar", "apr", "may", "jun", "jul", "sep", "oct", "nov", "dec", ] return render_to_response( "almanac/tide_index.html", locals(), context_instance=RequestContext(request) ) def tide_week_detail(request, slug, year, month, day): chart = TideChart.objects.get(place__slug=slug, year__exact=year) start_date = parse(str(year) + "-" + month + "-" + str(day)) end_date = start_date + timedelta(days=3) first_day_set = ( TideDay.objects.filter(tide_chart__place__slug__exact=slug) .exclude(day__date__gt=end_date) .filter(day__date__gte=start_date) ) second_start_date = start_date + timedelta(days=4) second_end_date = second_start_date + timedelta(days=3) second_day_set = ( TideDay.objects.filter(tide_chart__place__slug__exact=slug) .exclude(day__date__gt=second_end_date) .filter(day__date__gte=second_start_date) ) return render_to_response( "almanac/tide_week_detail.html", locals(), context_instance=RequestContext(request), ) def tide_month_detail(request, slug, year, month): chart = TideChart.objects.get(place__slug=slug, year__exact=year) days = TideDay.objects.filter( tide_chart__place__slug__exact=slug, day__date__year=year, day__date__month=parse(month).month, ) full_date = datetime(int(year), parse(month).month, 1) month = month.capitalize() today = date.today() return render_to_response( "almanac/tide_month_detail.html", locals(), context_instance=RequestContext(request), ) def tide_year_detail(request, slug, year): astro_days = Day.objects.filter(chart__year__exact=year) chart = TideChart.objects.get(place__slug=slug, year__exact=year) return render_to_response( "almanac/tide_year_detail.html", locals(), context_instance=RequestContext(request), ) def seasonal_guide(request, slug, year, month, day): today = datetime.today() chart = TideChart.objects.get(place__slug=slug, year__exact=year) start_date = parse(str(year) + "-" + month + "-" + str(day)) end_date = start_date + relativedelta(months=+1, days=-1) days = ( TideDay.objects.filter(tide_chart__place__slug=slug) .exclude(day__date__gt=end_date) .filter(day__date__gte=start_date) ) n = len(days) / 2 first_day_set = days[0:n] second_day_set = days[n:] # end_date=start_date+timedelta(days=13) # first_day_set=TideDay.objects.filter(tide_chart__place__slug__exact=slug).exclude( # day__date__gt=end_date).filter( # day__date__gte=start_date) # second_start_date=start_date+timedelta(days=14) # second_end_date=second_start_date+timedelta(days=13) # second_day_set=TideDay.objects.filter(tide_chart__place__slug__exact=slug).exclude( # day__date__gt=second_end_date).filter( # day__date__gte=second_start_date) noon = datetime(today.year, today.month, today.day, 12, 0) return render_to_response( "almanac/tide_seasonal_guide.html", locals(), context_instance=RequestContext(request), ) def weekly_dump(request, slug, year, month, day): response = HttpResponse(mimetype="text/csv") response["Content-Disposition"] = "attachment; filename=tides.csv" chart = TideChart.objects.get(place__slug=slug, year__exact=year) start_date = parse(str(year) + "-" + month + "-" + str(day)) end_date = start_date + timedelta(days=7) days = ( TideDay.objects.filter(tide_chart__place__slug=slug) .exclude(day__date__gt=end_date) .filter(day__date__gte=start_date) ) writer = csv.writer(response) for tday in days.all(): day = tday.day tide1 = tday.tide_1 tide2 = tday.tide_2 tide3 = tday.tide_3 tide4 = tday.tide_4 if tide4: writer.writerow( [ tday.day.date, tide1, tide1.state, tide1.level, tide2, tide2.state, tide2.level, tide3, tide3.state, tide3.level, tide4, tide4.state, tide4.level, day.moonphase, day.moonphase_time, day.moonrise, day.moonset, day.sunrise, day.sunset, ] ) else: writer.writerow( [ tday.day.date, tide1, tide1.state, tide1.level, tide2, tide2.state, tide2.level, tide3, tide3.state, tide3.level, "", "", "", day.moonphase, day.moonphase_time, day.moonrise, day.moonset, day.sunrise, day.sunset, ] ) return response def write_pdf(template_src, context_dict): template = get_template(template_src) context = Context(context_dict) html = template.render(context) result = StringIO.StringIO() pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result) if not pdf.err: return http.HttpResponse(result.getvalue(), mimetype="application/pdf") return http.HttpResponse("Gremlin's ate your pdf! %s" % cgi.escape(html)) def seasonal_guide_pdf(request, slug, year, month, day): today = datetime.today() chart = TideChart.objects.get(place__slug=slug, year__exact=year) start_date = parse(str(year) + "-" + month + "-" + str(day)) end_date = start_date + relativedelta(months=+1, days=-1) days = ( TideDay.objects.filter(tide_chart__place__slug=slug) .exclude(day__date__gt=end_date) .filter(day__date__gte=start_date) ) n = len(days) / 2 first_day_set = days[0:n] second_day_set = days[n:] noon = datetime(today.year, today.month, today.day, 12, 0) return write_pdf( "almanac/pdf/seasonal_guide.html", { "pagesize": "letter", "today": today, "noon": noon, "chart": chart, "days": days, "first_day_set": first_day_set, "second_day_set": second_day_set, }, )