summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluxagraf <sng@luxagraf.net>2016-01-19 14:40:24 -0500
committerluxagraf <sng@luxagraf.net>2016-01-19 14:40:24 -0500
commit7622933e291141b5d58293eacb813d0c0635695f (patch)
tree0fd8afb12c8ff2f18a353104d2fa97be9c07c6fa
parent0879504bd5029b2a3b9e937cb4620c4cd3108459 (diff)
added my daily journal recording app, weather grabbing widget and
checkin model. Still need to add widget to checkin admin to automatically grab the geodata from device.
-rw-r--r--app/daily/admin.py49
-rw-r--r--app/daily/migrations/0001_initial.py71
-rw-r--r--app/daily/migrations/0002_auto_20160118_2144.py21
-rw-r--r--app/daily/migrations/0003_auto_20160119_1206.py49
-rw-r--r--app/daily/migrations/0004_auto_20160119_1223.py30
-rw-r--r--app/daily/migrations/0005_remove_daily_slug.py19
-rw-r--r--app/daily/migrations/0006_daily_weather_human.py20
-rw-r--r--app/daily/migrations/__init__.py0
-rw-r--r--app/daily/models.py106
-rw-r--r--app/daily/retriever.py46
-rw-r--r--app/lib/templatetags/templatetags/f_to_c.py7
-rw-r--r--design/templates/human_weather.txt7
12 files changed, 425 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))
diff --git a/design/templates/human_weather.txt b/design/templates/human_weather.txt
new file mode 100644
index 0000000..677a690
--- /dev/null
+++ b/design/templates/human_weather.txt
@@ -0,0 +1,7 @@
+{% load f_to_c %}
+Today the high temperature was {{object.temp_max}}F/{{object.temp_max|f_to_c}}C and the low was {{object.temp_min}}F/{{object.temp_min|f_to_c}}C. The mean temp was {{object.temp_mean}}F/{{object.temp_mean|f_to_c}}C. The mean wind speed was {{object.wind_mean}}mph with gusts up to {{object.wind_max}}mph.
+{%if object.rain%}It rained {{object.rain_amount}} inches.{%endif%}
+{%if object.snow%}It snowed {{object.snow_amount}} inches.{%endif%}
+{%if object.hail%}It hailed.{%endif%}
+{%if object.thunder%}It thundered {%endif%}
+{%if object.fog%}There was fog{%endif%}