diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/daily/admin.py | 49 | ||||
-rw-r--r-- | app/daily/migrations/0001_initial.py | 71 | ||||
-rw-r--r-- | app/daily/migrations/0002_auto_20160118_2144.py | 21 | ||||
-rw-r--r-- | app/daily/migrations/0003_auto_20160119_1206.py | 49 | ||||
-rw-r--r-- | app/daily/migrations/0004_auto_20160119_1223.py | 30 | ||||
-rw-r--r-- | app/daily/migrations/0005_remove_daily_slug.py | 19 | ||||
-rw-r--r-- | app/daily/migrations/0006_daily_weather_human.py | 20 | ||||
-rw-r--r-- | app/daily/migrations/__init__.py | 0 | ||||
-rw-r--r-- | app/daily/models.py | 106 | ||||
-rw-r--r-- | app/daily/retriever.py | 46 | ||||
-rw-r--r-- | app/lib/templatetags/templatetags/f_to_c.py | 7 |
11 files changed, 418 insertions, 0 deletions
diff --git a/app/daily/admin.py b/app/daily/admin.py new file mode 100644 index 0000000..210aabc --- /dev/null +++ b/app/daily/admin.py @@ -0,0 +1,49 @@ +from django.contrib import admin +from django import forms +from django.contrib.gis.admin import OSMGeoAdmin + +from utils.widgets import AdminImageWidget, LGEntryForm +from .models import CheckIn, Daily, Weather + + +class WeatherAdmin(OSMGeoAdmin): + pass + + +class DailyAdmin(OSMGeoAdmin): + form = LGEntryForm + fieldsets = ( + (None, { + 'fields': ( + 'title', + 'body_markdown', + 'weather_human', + ) + }), + ('Details', { + 'fields': ( + 'location', + 'weather', + 'date' + ), + 'classes': ('collapse',), + }), + ) + + +class CheckInAdmin(OSMGeoAdmin): + list_display = ('date', 'location') + default_lon = -9285175 + default_lat = 4025046 + default_zoom = 15 + units = True + scrollable = False + map_width = 700 + map_height = 425 + map_template = 'gis/admin/osm.html' + openlayers_url = '/static/admin/js/OpenLayers.js' + + +admin.site.register(CheckIn, CheckInAdmin) +admin.site.register(Weather, WeatherAdmin) +admin.site.register(Daily, DailyAdmin) diff --git a/app/daily/migrations/0001_initial.py b/app/daily/migrations/0001_initial.py new file mode 100644 index 0000000..b3ba687 --- /dev/null +++ b/app/daily/migrations/0001_initial.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2016-01-18 20:38 +from __future__ import unicode_literals + +import django.contrib.gis.db.models.fields +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('locations', '__first__'), + ] + + operations = [ + migrations.CreateModel( + name='CheckIn', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('point', django.contrib.gis.db.models.fields.PointField(blank=True, srid=4326)), + ('date', models.DateField(default=django.utils.timezone.now)), + ('location', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='locations.Location')), + ], + ), + migrations.CreateModel( + name='Daily', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('slug', models.SlugField()), + ('body_html', models.TextField(blank=True)), + ('body_markdown', models.TextField()), + ('date', models.DateField(verbose_name='Date published')), + ('location', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='locations.Location')), + ], + options={ + 'get_latest_by': 'date', + 'ordering': ('date',), + }, + ), + migrations.CreateModel( + name='Weather', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('point', django.contrib.gis.db.models.fields.PointField(blank=True, null=True, srid=4326)), + ('date', models.DateField()), + ('temp_max', models.CharField(max_length=4)), + ('temp_min', models.CharField(max_length=4)), + ('temp_mean', models.CharField(max_length=4)), + ('wind_mean', models.CharField(max_length=10)), + ('wind_max', models.CharField(max_length=10)), + ('humidity', models.CharField(max_length=10)), + ('snow_amount', models.CharField(max_length=10)), + ('rain_amount', models.CharField(max_length=10)), + ('fog', models.NullBooleanField()), + ('rain', models.NullBooleanField()), + ('snow', models.NullBooleanField()), + ('hail', models.NullBooleanField()), + ('thunder', models.NullBooleanField()), + ], + ), + migrations.AddField( + model_name='daily', + name='weather', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='daily.Weather'), + ), + ] diff --git a/app/daily/migrations/0002_auto_20160118_2144.py b/app/daily/migrations/0002_auto_20160118_2144.py new file mode 100644 index 0000000..4769c21 --- /dev/null +++ b/app/daily/migrations/0002_auto_20160118_2144.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2016-01-18 21:44 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('daily', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='checkin', + name='location', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='locations.Location'), + ), + ] diff --git a/app/daily/migrations/0003_auto_20160119_1206.py b/app/daily/migrations/0003_auto_20160119_1206.py new file mode 100644 index 0000000..d28c9ff --- /dev/null +++ b/app/daily/migrations/0003_auto_20160119_1206.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2016-01-19 12:06 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('daily', '0002_auto_20160118_2144'), + ] + + operations = [ + migrations.AlterModelOptions( + name='checkin', + options={'get_latest_by': 'date', 'ordering': ('-date',)}, + ), + migrations.AlterModelOptions( + name='weather', + options={'get_latest_by': 'date', 'ordering': ('-date',), 'verbose_name_plural': 'Weather'}, + ), + migrations.AlterField( + model_name='daily', + name='body_html', + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name='daily', + name='body_markdown', + field=models.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name='daily', + name='slug', + field=models.SlugField(blank=True, null=True), + ), + migrations.AlterField( + model_name='daily', + name='title', + field=models.CharField(blank=True, max_length=200, null=True), + ), + migrations.AlterField( + model_name='daily', + name='weather', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='daily.Weather'), + ), + ] diff --git a/app/daily/migrations/0004_auto_20160119_1223.py b/app/daily/migrations/0004_auto_20160119_1223.py new file mode 100644 index 0000000..3c77deb --- /dev/null +++ b/app/daily/migrations/0004_auto_20160119_1223.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2016-01-19 12:23 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('daily', '0003_auto_20160119_1206'), + ] + + operations = [ + migrations.AlterField( + model_name='weather', + name='temp_max', + field=models.CharField(max_length=8), + ), + migrations.AlterField( + model_name='weather', + name='temp_mean', + field=models.CharField(max_length=8), + ), + migrations.AlterField( + model_name='weather', + name='temp_min', + field=models.CharField(max_length=8), + ), + ] diff --git a/app/daily/migrations/0005_remove_daily_slug.py b/app/daily/migrations/0005_remove_daily_slug.py new file mode 100644 index 0000000..8a896ba --- /dev/null +++ b/app/daily/migrations/0005_remove_daily_slug.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2016-01-19 13:38 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('daily', '0004_auto_20160119_1223'), + ] + + operations = [ + migrations.RemoveField( + model_name='daily', + name='slug', + ), + ] diff --git a/app/daily/migrations/0006_daily_weather_human.py b/app/daily/migrations/0006_daily_weather_human.py new file mode 100644 index 0000000..7f701b4 --- /dev/null +++ b/app/daily/migrations/0006_daily_weather_human.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2016-01-19 13:45 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('daily', '0005_remove_daily_slug'), + ] + + operations = [ + migrations.AddField( + model_name='daily', + name='weather_human', + field=models.TextField(blank=True, null=True), + ), + ] diff --git a/app/daily/migrations/__init__.py b/app/daily/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/app/daily/migrations/__init__.py diff --git a/app/daily/models.py b/app/daily/models.py new file mode 100644 index 0000000..43c1a85 --- /dev/null +++ b/app/daily/models.py @@ -0,0 +1,106 @@ +from django.contrib.gis.db import models +from django.core.urlresolvers import reverse +from django.conf import settings +from django import forms +from django.utils import timezone + +from locations.models import Location + +from utils.widgets import markdown_to_html + + +class CheckIn(models.Model): + point = models.PointField(blank=True) + location = models.ForeignKey(Location, blank=True, null=True) + date = models.DateField(default=timezone.now) + + class Meta: + ordering = ('-date',) + get_latest_by = 'date' + + def __str__(self): + return str(self.date) + + @property + def lon(self): + '''Get the site's longitude.''' + return self.point.x + + @property + def lat(self): + '''Get the site's latitude.''' + return self.point.y + + def save(self): + try: + self.location = Location.objects.filter(geometry__contains=self.point).get() + except Location.DoesNotExist: + raise forms.ValidationError("There is no location associated with that point, add it: %sadmin/locations/location/add/" % (settings.BASE_URL)) + super(CheckIn, self).save() + + +class Weather(models.Model): + point = models.PointField(null=True, blank=True) + date = models.DateField() + temp_max = models.CharField(max_length=8) + temp_min = models.CharField(max_length=8) + temp_mean = models.CharField(max_length=8) + wind_mean = models.CharField(max_length=10) + wind_max = models.CharField(max_length=10) + humidity = models.CharField(max_length=10) + snow_amount = models.CharField(max_length=10) + rain_amount = models.CharField(max_length=10) + fog = models.NullBooleanField() + rain = models.NullBooleanField() + snow = models.NullBooleanField() + hail = models.NullBooleanField() + thunder = models.NullBooleanField() + + class Meta: + ordering = ('-date',) + get_latest_by = 'date' + verbose_name_plural = "Weather" + + def __str__(self): + return str(self.date) + + +class Daily(models.Model): + location = models.ForeignKey(Location, blank=True) + weather = models.ForeignKey(Weather, blank=True, null=True) + weather_human = models.TextField(blank=True, null=True) + title = models.CharField(max_length=200, blank=True, null=True) + body_html = models.TextField(blank=True, null=True) + body_markdown = models.TextField(blank=True, null=True) + date = models.DateField('Date published') + + class Meta: + ordering = ('date',) + get_latest_by = 'date' + + def __str__(self): + return str(self.date) + + @property + def longitude(self): + '''Get the site's longitude.''' + return self.point.x + + @property + def latitude(self): + '''Get the site's latitude.''' + return self.point.y + + @property + def get_previous_published(self): + return self.get_previous_by_pub_date(status__exact=1) + + @property + def get_next_published(self): + return self.get_next_by_pub_date(status__exact=1) + + def save(self, **kwargs): + if self.body_markdown: + self.body_html = markdown_to_html(self.body_markdown) + self.location = CheckIn.objects.latest().location + super(Daily, self).save() diff --git a/app/daily/retriever.py b/app/daily/retriever.py new file mode 100644 index 0000000..d5b023f --- /dev/null +++ b/app/daily/retriever.py @@ -0,0 +1,46 @@ +from datetime import datetime +import requests +import json + +from django.utils import timezone +from django.template.loader import render_to_string + +from .models import CheckIn, Daily, Weather + + +def create_daily(): + d, created = Daily.objects.get_or_create( + date=timezone.now() + ) + + +def get_yesterday_weather(): + current = CheckIn.objects.latest() + PB_URL = "http://api.wunderground.com/api/39c3ce6a12b14e75/yesterday/q/%s,%s.json" % (current.lat, current.lon) + r = requests.get(PB_URL) + weather = json.loads(r.text) + data = weather['history']['dailysummary'][0] + date = "%s %s %s" % (data['date']['year'], data['date']['mon'], data['date']['mday']) + dt = datetime.strptime(date, "%Y %m %d") + w, created = Weather.objects.get_or_create( + point=current.point, + date=dt, + temp_max=data['maxtempi'], + temp_min=data['mintempi'], + temp_mean=data['meantempi'], + wind_mean=data['meanwindspdi'], + wind_max=data['maxwspdi'], + humidity=data['humidity'], + snow_amount=data['snowfalli'], + rain_amount=data['precipi'], + fog=int(data['fog']), + rain=int(data['rain']), + snow=int(data['snow']), + hail=int(data['hail']), + thunder=int(data['thunder']), + ) + if created: + d = Daily.objects.get(date=dt) + d.weather = w + d.weather_human = render_to_string('human_weather.txt', {'object': w}).strip() + d.save() diff --git a/app/lib/templatetags/templatetags/f_to_c.py b/app/lib/templatetags/templatetags/f_to_c.py new file mode 100644 index 0000000..343395a --- /dev/null +++ b/app/lib/templatetags/templatetags/f_to_c.py @@ -0,0 +1,7 @@ +from django import template +register = template.Library() + + +@register.filter +def f_to_c(temp): + return str(round((int(temp) - 32) * 5.0/9.0, 1)) |