bikemap/tracking/models.py

94 lines
2.8 KiB
Python
Raw Normal View History

2015-09-08 16:55:41 +00:00
from django.contrib.gis.db import models
from django.contrib.gis import geos
from django.db import transaction
2015-09-08 16:55:41 +00:00
2015-09-01 03:31:25 +00:00
# Create your models here.
2015-09-01 04:47:56 +00:00
from django.contrib.auth.models import User
2015-09-01 03:31:25 +00:00
class TrackManager(models.Manager):
2015-09-08 17:43:13 +00:00
def get_or_create_from_gpx(cls, obj, user):
# Get some Meta data from the gpx file.
metadata = obj['metadata']
start_time = metadata['time']
# Get the the track and segments from the gpx file.
tracks = obj['trk']
name = tracks['name']
segments = tracks['trkseg']
2015-09-08 17:43:13 +00:00
track, created = cls.model.objects.get_or_create(
user=user,
start=start_time,
name=name)
if created:
with transaction.atomic():
points = segments['trkpt']
segment = Segment(
track=track,
time=points[0]['time'])
segment.save()
for pt in points:
lon = float(pt['@lon'])
lat = float(pt['@lat'])
Point.objects.create(
segment=segment,
time=pt['time'],
elevation=pt['ele'],
point=geos.Point(lon, lat))
2015-09-08 17:43:47 +00:00
return track, created
2015-09-01 03:31:25 +00:00
class Track(models.Model):
2015-09-01 04:47:56 +00:00
user = models.ForeignKey(User, blank=False)
2015-09-01 03:31:25 +00:00
start = models.DateTimeField()
name = models.CharField(max_length=1024, blank=False)
description = models.TextField(blank=True)
objects = TrackManager()
2015-09-01 03:31:25 +00:00
@property
def finish(self):
2015-09-01 04:47:56 +00:00
return self.segment_set.order_by("-time")[0].finish
2015-09-01 03:31:25 +00:00
def __str__(self):
return "[{user}] '{name}' from {start} to {finish}".format(
user=self.user.username,
name=self.name,
start=self.start,
finish=self.finish)
2015-09-01 04:50:22 +00:00
class Segment(models.Model):
track = models.ForeignKey(Track)
2015-09-01 04:47:56 +00:00
time = models.DateTimeField()
number = models.IntegerField(default=1)
@property
def finish(self):
return self.point_set.order_by("-time")[0].time
2015-09-01 03:31:25 +00:00
def __str__(self):
return "'{name}' Segment #{number} at {tme}".format(
name=self.track.name,
number=self.number,
tme=self.time)
2015-09-01 04:50:22 +00:00
2015-09-01 03:31:25 +00:00
class Point(models.Model):
time = models.DateTimeField()
elevation = models.DecimalField(max_digits=20, decimal_places=2)
segment = models.ForeignKey(Segment)
2015-09-08 16:55:41 +00:00
# GeoDjango-specific: a geometry field (MultiPolygonField), and
# overriding the default manager with a GeoManager instance.
point = models.PointField()
objects = models.GeoManager()
def __str__(self):
return "'{name}' ({lat},{lon}) -> {alt} on {time}".format(
2015-09-08 16:55:41 +00:00
lat=self.point.x,
lon=self.point.y,
alt=self.elevation,
time=self.time,
name=self.segment.track.name)