views.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import csv
  2. import pywapi
  3. from datetime import datetime, date , timedelta
  4. from dateutil.relativedelta import relativedelta
  5. from dateutil.parser import parse
  6. from django import http
  7. from django.template.loader import get_template
  8. from django.template import Context
  9. import ho.pisa as pisa
  10. import cStringIO as StringIO
  11. import cgi
  12. from django.http import HttpResponse
  13. from django.template.context import RequestContext
  14. from django.views.generic import list_detail
  15. from django.shortcuts import render_to_response
  16. from almanac.models import Tide, TideDay, TideChart, Day, WeatherConditions, WeatherAlert, WeatherForecast
  17. from darkroom.models import Webcam
  18. from directory.models import Place, Point, Town
  19. def index(request):
  20. webcams=Webcam.objects.all()
  21. towns=Town.objects.filter(in_coverage=True)
  22. town_weather = []
  23. for t in towns:
  24. if t.slug == 'castine' or t.slug == 'stonington' or t.slug == 'blue-hill':
  25. town_weather.append(pywapi.get_weather_from_yahoo(t.zipcode, 'imperial'))
  26. if datetime.now().hour > 20 or datetime.now().hour < 4:
  27. moon="moon"
  28. else:
  29. moon=""
  30. return render_to_response('almanac/index.html', locals(),
  31. context_instance=RequestContext(request))
  32. def tide_index(request):
  33. charts=TideChart.objects.filter(public=True).order_by('-year')
  34. months=['jan','feb','mar','apr','may','jun','jul','sep','oct','nov','dec']
  35. return render_to_response('almanac/tide_index.html', locals(),
  36. context_instance=RequestContext(request))
  37. def tide_week_detail(request, slug, year, month, day):
  38. chart=TideChart.objects.get(place__slug=slug, year__exact=year)
  39. start_date=parse(str(year)+'-'+month+'-'+str(day))
  40. end_date=start_date+timedelta(days=3)
  41. first_day_set=TideDay.objects.filter(tide_chart__place__slug__exact=slug).exclude(
  42. day__date__gt=end_date).filter(
  43. day__date__gte=start_date)
  44. second_start_date=start_date+timedelta(days=4)
  45. second_end_date=second_start_date+timedelta(days=3)
  46. second_day_set=TideDay.objects.filter(tide_chart__place__slug__exact=slug).exclude(
  47. day__date__gt=second_end_date).filter(
  48. day__date__gte=second_start_date)
  49. return render_to_response('almanac/tide_week_detail.html', locals(),
  50. context_instance=RequestContext(request))
  51. def tide_month_detail(request, slug, year, month):
  52. chart=TideChart.objects.get(place__slug=slug, year__exact=year)
  53. days=TideDay.objects.filter(tide_chart__place__slug__exact=slug,
  54. day__date__year=year,
  55. day__date__month=parse(month).month)
  56. full_date=datetime(int(year), parse(month).month, 1)
  57. month = month.capitalize()
  58. today=date.today()
  59. return render_to_response('almanac/tide_month_detail.html', locals(),
  60. context_instance=RequestContext(request))
  61. def tide_year_detail(request, slug, year):
  62. astro_days=Day.objects.filter(chart__year__exact=year)
  63. chart=TideChart.objects.get(place__slug=slug, year__exact=year)
  64. return render_to_response('almanac/tide_year_detail.html', locals(),
  65. context_instance=RequestContext(request))
  66. def seasonal_guide(request, slug, year, month, day):
  67. today = datetime.today()
  68. chart = TideChart.objects.get(place__slug=slug, year__exact=year)
  69. start_date=parse(str(year)+'-'+month+'-'+str(day))
  70. end_date = start_date+relativedelta(months=+1, days=-1)
  71. days = TideDay.objects.filter(tide_chart__place__slug=slug).exclude(day__date__gt=end_date).filter(day__date__gte=start_date)
  72. n = len(days)/2
  73. first_day_set = days[0:n]
  74. second_day_set = days[n:]
  75. #end_date=start_date+timedelta(days=13)
  76. #first_day_set=TideDay.objects.filter(tide_chart__place__slug__exact=slug).exclude(
  77. # day__date__gt=end_date).filter(
  78. # day__date__gte=start_date)
  79. #second_start_date=start_date+timedelta(days=14)
  80. #second_end_date=second_start_date+timedelta(days=13)
  81. #second_day_set=TideDay.objects.filter(tide_chart__place__slug__exact=slug).exclude(
  82. # day__date__gt=second_end_date).filter(
  83. # day__date__gte=second_start_date)
  84. noon = datetime(today.year, today.month, today.day, 12, 0)
  85. return render_to_response('almanac/tide_seasonal_guide.html', locals(),
  86. context_instance=RequestContext(request))
  87. def weekly_dump(request, slug, year, month, day):
  88. response=HttpResponse(mimetype='text/csv')
  89. response['Content-Disposition'] = 'attachment; filename=tides.csv'
  90. chart=TideChart.objects.get(place__slug=slug, year__exact=year)
  91. start_date=parse(str(year)+'-'+month+'-'+str(day))
  92. end_date=start_date+timedelta(days=7)
  93. days=TideDay.objects.filter(tide_chart__place__slug=slug).exclude(day__date__gt=end_date).filter(day__date__gte=start_date)
  94. writer=csv.writer(response)
  95. for tday in days.all():
  96. day=tday.day
  97. tide1=tday.tide_1
  98. tide2=tday.tide_2
  99. tide3=tday.tide_3
  100. tide4=tday.tide_4
  101. if tide4:
  102. 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])
  103. else:
  104. 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])
  105. return response
  106. def write_pdf(template_src, context_dict):
  107. template = get_template(template_src)
  108. context = Context(context_dict)
  109. html = template.render(context)
  110. result = StringIO.StringIO()
  111. pdf = pisa.pisaDocument(StringIO.StringIO(
  112. html.encode("UTF-8")), result)
  113. if not pdf.err:
  114. return http.HttpResponse(result.getvalue(), mimetype='application/pdf')
  115. return http.HttpResponse('Gremlin\'s ate your pdf! %s' % cgi.escape(html))
  116. def seasonal_guide_pdf(request, slug, year, month, day):
  117. today = datetime.today()
  118. chart = TideChart.objects.get(place__slug=slug, year__exact=year)
  119. start_date=parse(str(year)+'-'+month+'-'+str(day))
  120. end_date = start_date+relativedelta(months=+1, days=-1)
  121. days = TideDay.objects.filter(tide_chart__place__slug=slug).exclude(day__date__gt=end_date).filter(day__date__gte=start_date)
  122. n = len(days)/2
  123. first_day_set = days[0:n]
  124. second_day_set = days[n:]
  125. noon = datetime(today.year, today.month, today.day, 12, 0)
  126. return write_pdf('almanac/pdf/seasonal_guide.html',{
  127. 'pagesize' : 'letter',
  128. 'today' : today,
  129. 'noon' : noon,
  130. 'chart' : chart,
  131. 'days': days,
  132. 'first_day_set': first_day_set,
  133. 'second_day_set': second_day_set})