Add more migrations, import working.
This commit is contained in:
parent
aa9c14da6e
commit
b94bcf3b02
|
@ -1,4 +1,4 @@
|
||||||
Django==1.8.4
|
Django==1.8.4
|
||||||
django-extensions
|
django-extensions
|
||||||
coverage
|
coverage
|
||||||
gpxpy
|
xmltodict
|
|
@ -2,7 +2,8 @@ __author__ = 'tyrel'
|
||||||
from django.core.management.base import BaseCommand, CommandError
|
from django.core.management.base import BaseCommand, CommandError
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from tracking.models import Track, Segment, Point
|
from tracking.models import Track, Segment, Point
|
||||||
import gpxpy
|
import xmltodict
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
@ -14,43 +15,62 @@ class Command(BaseCommand):
|
||||||
parser.add_argument('filepath', help="File or directory to import a gpx file.")
|
parser.add_argument('filepath', help="File or directory to import a gpx file.")
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
username = options['username']
|
self.username = options['username']
|
||||||
filepath = options['filepath']
|
filepath = options['filepath']
|
||||||
try:
|
|
||||||
user = User.objects.get(username=username)
|
|
||||||
except User.DoesNotExist:
|
|
||||||
raise CommandError("User %s does not exist" % username)
|
|
||||||
|
|
||||||
self.stdout.write("Importing for user %s" % user.username)
|
try:
|
||||||
|
self.user = User.objects.get(username=self.username)
|
||||||
|
except User.DoesNotExist:
|
||||||
|
raise CommandError("User {0} does not exist".format(self.username))
|
||||||
|
|
||||||
if os.path.isdir(filepath):
|
if os.path.isdir(filepath):
|
||||||
self.import_directory(user, filepath)
|
self.import_directory(filepath)
|
||||||
elif os.path.isfile(filepath):
|
elif os.path.isfile(filepath):
|
||||||
self.import_file(user, filepath)
|
self.import_file(filepath)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise CommandError("{0} is neither an existing file, nor a path.".format(filepath))
|
raise CommandError("{0} is neither an existing file, nor a path.".format(filepath))
|
||||||
|
|
||||||
|
def import_directory(self, directory):
|
||||||
def import_file(self, user, filename):
|
|
||||||
with open(filename, 'r') as f:
|
|
||||||
gpx = gpxpy.parse(f)
|
|
||||||
|
|
||||||
for g_track in gpx.tracks:
|
|
||||||
for g_segment in g_track.segments:
|
|
||||||
for g_point in g_segment.points:
|
|
||||||
print 'Point at ({0},{1}) -> {2} -> {3}'.format(g_point.latitude, g_point.longitude, g_point.elevation)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def import_directory(self, user, directory):
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def import_file(self, filename):
|
||||||
|
with open(filename) as fd:
|
||||||
|
obj = dict(xmltodict.parse(fd.read()))['gpx']
|
||||||
|
|
||||||
|
metadata = obj['metadata']
|
||||||
|
tracks = obj['trk']
|
||||||
|
|
||||||
|
start_time = metadata['time']
|
||||||
|
|
||||||
|
name = tracks['name']
|
||||||
|
segments = tracks['trkseg']
|
||||||
|
if isinstance(segments, list):
|
||||||
|
raise NotImplemented(
|
||||||
|
"Haven't run across one that has multiple segments. "
|
||||||
|
"Contribute a patch if you have.")
|
||||||
|
elif isinstance(segments, dict):
|
||||||
|
track = Track.objects.create(user=self.user,
|
||||||
|
start=start_time,
|
||||||
|
name=name)
|
||||||
|
points = segments['trkpt']
|
||||||
|
segment = Segment(track=track, time=points[0]['time'])
|
||||||
|
segment.save()
|
||||||
|
for pt in points:
|
||||||
|
Point.objects.create(segment=segment,
|
||||||
|
time=pt['time'],
|
||||||
|
elevation=pt['ele'],
|
||||||
|
latitude=pt['@lat'],
|
||||||
|
longitude=pt['@lon'])
|
||||||
|
print "created Track <{0}> start: {1}, stop: {2}".format(
|
||||||
|
track.name,
|
||||||
|
track.start,
|
||||||
|
track.finish
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def etree_to_dict(t):
|
def etree_to_dict(t):
|
||||||
d = {t.tag : map(etree_to_dict, t.getchildren())}
|
d = {t.tag: map(etree_to_dict, t.getchildren())}
|
||||||
d.update(('@' + k, v) for k, v in t.attrib.iteritems())
|
d.update(('@' + k, v) for k, v in t.attrib.iteritems())
|
||||||
d['text'] = t.text
|
d['text'] = t.text
|
||||||
return d
|
return d
|
22
tracking/migrations/0003_track_user.py
Normal file
22
tracking/migrations/0003_track_user.py
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('tracking', '0002_auto_20150901_0355'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='track',
|
||||||
|
name='user',
|
||||||
|
field=models.ForeignKey(default=None, to=settings.AUTH_USER_MODEL),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
19
tracking/migrations/0004_segment_number.py
Normal file
19
tracking/migrations/0004_segment_number.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('tracking', '0003_track_user'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='segment',
|
||||||
|
name='number',
|
||||||
|
field=models.IntegerField(default=1),
|
||||||
|
),
|
||||||
|
]
|
21
tracking/migrations/0005_segment_time.py
Normal file
21
tracking/migrations/0005_segment_time.py
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('tracking', '0004_segment_number'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='segment',
|
||||||
|
name='time',
|
||||||
|
field=models.DateTimeField(default=datetime.datetime(2015, 9, 1, 0, 43, 4, 754000)),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,19 +1,26 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
|
||||||
|
|
||||||
class Track(models.Model):
|
class Track(models.Model):
|
||||||
|
user = models.ForeignKey(User, blank=False)
|
||||||
start = models.DateTimeField()
|
start = models.DateTimeField()
|
||||||
name = models.CharField(max_length=1024, blank=False)
|
name = models.CharField(max_length=1024, blank=False)
|
||||||
description = models.TextField(blank=True)
|
description = models.TextField(blank=True)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def finish(self):
|
def finish(self):
|
||||||
return self.point_set.order_by("-time")[0].time
|
return self.segment_set.order_by("-time")[0].finish
|
||||||
|
|
||||||
class Segment(models.Model):
|
class Segment(models.Model):
|
||||||
track = models.ForeignKey(Track)
|
track = models.ForeignKey(Track)
|
||||||
|
time = models.DateTimeField()
|
||||||
|
number = models.IntegerField(default=1)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def finish(self):
|
||||||
|
return self.point_set.order_by("-time")[0].time
|
||||||
|
|
||||||
class Point(models.Model):
|
class Point(models.Model):
|
||||||
time = models.DateTimeField()
|
time = models.DateTimeField()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user