123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- 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,
- },
- )
|