summaryrefslogtreecommitdiff
path: root/app
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 /app
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.
Diffstat (limited to 'app')
-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
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))