summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
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))