Skip to content

Commit

Permalink
Merge 2590e19 into 97d0ee6
Browse files Browse the repository at this point in the history
  • Loading branch information
Coop56 committed Feb 5, 2018
2 parents 97d0ee6 + 2590e19 commit e412ca5
Show file tree
Hide file tree
Showing 28 changed files with 271 additions and 241 deletions.
7 changes: 0 additions & 7 deletions mapstory/apps/boxes/urls.py

This file was deleted.

File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from mapstory.apps.boxes.models import StoryBox
from mapstory.apps.storyframes.models import StoryFrame
from django.contrib import admin

class StoryBoxAdmin(admin.ModelAdmin):
class StoryFrameAdmin(admin.ModelAdmin):
list_display = ('id', 'map', 'title')
list_filter = ('map',)
search_fields = ('map__title', 'title', 'description',)


admin.site.register(StoryBox, StoryBoxAdmin)
admin.site.register(StoryFrame, StoryFrameAdmin)
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
import json

from django import forms
from mapstory.apps.storyframes.models import StoryFrame
from mapstory.apps.storyframes.utils import datetime_to_seconds
from mapstory.apps.storyframes.utils import make_point
from mapstory.apps.storyframes.utils import parse_date_time

from mapstory.annotations.models import Annotation
from mapstory.annotations.utils import datetime_to_seconds
from mapstory.annotations.utils import make_point
from mapstory.annotations.utils import parse_date_time
import json


class AnnotationForm(forms.ModelForm):
class StoryFrameForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
self.form_mode = kwargs.pop('form_mode', 'client')
super(AnnotationForm, self).__init__(*args, **kwargs)
super(StoryFrameForm, self).__init__(*args, **kwargs)

def parse_float(self, name):
val = self.data.get(name, None)
Expand Down Expand Up @@ -42,7 +41,7 @@ def full_clean(self):
self.data['the_geom'] = make_point(lon, lat)
self._convert_time('start_time')
self._convert_time('end_time')
super(AnnotationForm, self).full_clean()
super(StoryFrameForm, self).full_clean()
self._errors.update(self._my_errors)

def _convert_time(self, key):
Expand Down Expand Up @@ -73,5 +72,5 @@ def _convert_time(self, key):
self.data[key] = str(numeric) if numeric is not None else None

class Meta:
model = Annotation
model = StoryFrame
fields = '__all__'
15 changes: 15 additions & 0 deletions mapstory/apps/storyframes/migrations/0002_auto_20180120_1449.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('storyframes', '0001_initial'),
]

operations = [
migrations.RenameModel('StoryBox', 'StoryFrame')
]
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
from django.db import models
from mapstory.mapstories.models import Map
from mapstory.apps.boxes.utils import parse_date_time
from mapstory.apps.storyframes.utils import parse_date_time
from datetime import datetime
from django.contrib.gis.db import models as gis


class StoryBoxManager(models.Manager):
class StoryFrameManager(models.Manager):

def copy_map_story_boxes(self, source_id, target):
def copy_map_story_frames(self, source_id, target):
source = Map.objects.get(id=source_id)
copies = []
print('copy from', source_id, source.storybox_set.all())
print('copy from', source_id, source.storyframe_set.all())
print('to target', target.id)
for box in source.storybox_set.all():
box.map = target
box.pk = None
copies.append(box)
for storyframe in source.storyframe_set.all():
storyframe.map = target
storyframe.pk = None
copies.append(storyframe)
print(copies)
StoryBox.objects.bulk_create(copies)
StoryFrame.objects.bulk_create(copies)


class StoryBox(models.Model):
objects = StoryBoxManager()
class StoryFrame(models.Model):
objects = StoryFrameManager()

PLAYBACK_RATE = (('seconds', 'Seconds'),('minutes', 'Minutes'),)
INTERVAL_RATE = (('minutes', 'Minutes'),('hours', 'Hours'),
Expand Down Expand Up @@ -62,12 +62,12 @@ def end_time_str(self):
return self._timefmt(self.end_time) if self.end_time else ''

class Meta:
verbose_name_plural = "StoryBox"
verbose_name_plural = "StoryFrame"


def map_copied(sender, source_id, **kw):
try:
StoryBox.objects.copy_map_story_boxes(source_id, sender)
StoryFrame.objects.copy_map_story_frames(source_id, sender)
except:
import traceback
traceback.print_exc()
84 changes: 42 additions & 42 deletions mapstory/apps/boxes/tests.py → mapstory/apps/storyframes/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@
from mapstory.tests.populate_test_data import create_models
from mapstory.mapstories.models import Map
from django.core.urlresolvers import reverse
from .forms import StoryBoxForm
from .forms import StoryFrameForm
from .utils import parse_date_time, datetime_to_seconds, make_point
from .models import StoryBox
from .models import StoryFrame
from mapstory.tests.MapStoryTestMixin import MapStoryTestMixin
from django.test import TestCase
from mapstory.apps.boxes.views import boxes
from .views import storyframes

# @TODO Replace this with something better that doesn't specify a username and password.
class AdminClient(Client):
Expand All @@ -33,36 +33,36 @@ def setUp(self):

create_models(type='map')

def test_box_form(self):
def test_storyframe_form(self):
data = {}
m = Map.objects.first()
form = StoryBoxForm(data=data)
form = StoryFrameForm(data=data)
self.assertFalse(form.is_valid())
self.assertTrue('map' in form.errors.keys())
self.assertTrue('title' in form.errors.keys())

data['map'] = m.id
data['title'] = 'this is a test'

form = StoryBoxForm(data=data)
form = StoryFrameForm(data=data)
self.assertTrue(form.is_valid())

data['geometry'] = make_point(-77.464599609375, 37.61423141542417)

form = StoryBoxForm(data=data)
form = StoryFrameForm(data=data)
self.assertTrue(form.is_valid())

def test_box_form_parse_float(self):
def test_storyframe_form_parse_float(self):
"""
Tests the parse float method on the box form.
Tests the parse float method on the storyframe form.
"""
form = StoryBoxForm(data={'test': '1234.234'})
form = StoryFrameForm(data={'test': '1234.234'})
self.assertEqual(form.parse_float('test'), 1234.234)

self.assertIsNone(form.parse_float('nope'))

# ensure value errors get added to the form.errors dict
form = StoryBoxForm(data={'lat': 'nope'})
form = StoryFrameForm(data={'lat': 'nope'})
form.full_clean()
self.assertTrue('lat' in form.errors)

Expand Down Expand Up @@ -100,63 +100,63 @@ def test_datetime_to_seconds(self):
self.assertEqual(datetime_to_seconds(datetime.datetime(2009, 10, 21, 0, 0)), 1256083200)


def test_boxes_view(self):
def test_storyframes_view(self):
"""
Tests various methods of the boxes view.
Tests various methods of the storyframes view.
"""
m = Map.objects.first()

c = AdminClient()
response = c.get(reverse('boxes', args=[m.id]))
response = c.get(reverse('storyframes', args=[m.id]))
self.assertEqual(response.status_code, 200)

response = c.delete(reverse('boxes', args=[m.id]))
response = c.delete(reverse('storyframes', args=[m.id]))
self.assertEqual(response.status_code, 400)

response = c.put(reverse('boxes', args=[m.id]))
response = c.put(reverse('storyframes', args=[m.id]))
self.assertEqual(response.status_code, 400)

data = dict(map=m.id, title='this is a test', geometry=make_point(-77.464599609375, 37.61423141542417))
response = c.post(reverse('boxes', args=[m.id]), data=data)
response = c.post(reverse('storyframes', args=[m.id]), data=data)
self.assertEqual(response.status_code, 403)

# TODO: Test POST request with box payload
# TODO: Test POST request with storyframe payload
c.login_as_admin()

data = {"type":"FeatureCollection","features":[{"type":"Feature","properties":{"playback":3,"playbackRate":"seconds","interval":1,"intervalRate":"years","title":"Sample Title","description":"Sample Description","start_time":946684800,"end_time":1577836800,"zoom":6,"center":[1766040.0266747456,729122.1624405942],"range":{"start":946684800000,"end":1577836800000},"speed":{"interval":31536000000,"seconds":3},"_offset":0,"_id":1444749022177}}]}

response = c.post(reverse('boxes', args=[m.id]), data=json.dumps(data), content_type='application/json')
response = c.post(reverse('storyframes', args=[m.id]), data=json.dumps(data), content_type='application/json')
self.assertEqual(response.status_code, 200)

box = StoryBox.objects.first()
storyframe = StoryFrame.objects.first()
feature = data['features'][0]
self.assertEqual(box.map, m)
self.assertEqual(box.title, feature['properties']['title'])
self.assertEqual(box.playback, feature['properties']['playback'])
self.assertEqual(box.playbackRate, feature['properties']['playbackRate'])
self.assertEqual(box.interval, feature['properties']['interval'])
self.assertEqual(box.intervalRate, feature['properties']['intervalRate'])
self.assertEqual(box.description, feature['properties']['description'])
self.assertEqual(box.start_time, feature['properties']['start_time'])
self.assertEqual(box.end_time, feature['properties']['end_time'])
self.assertEqual(box.zoom, feature['properties']['zoom'])
self.assertEqual(eval(box.center), feature['properties']['center'])
self.assertEqual(eval(box.speed), feature['properties']['speed'])


class BoxesViewUnitTests(TestCase):
def test__boxes_get(self):
self.assertIsNotNone(boxes)

def test_boxes(self):
self.assertEqual(storyframe.map, m)
self.assertEqual(storyframe.title, feature['properties']['title'])
self.assertEqual(storyframe.playback, feature['properties']['playback'])
self.assertEqual(storyframe.playbackRate, feature['properties']['playbackRate'])
self.assertEqual(storyframe.interval, feature['properties']['interval'])
self.assertEqual(storyframe.intervalRate, feature['properties']['intervalRate'])
self.assertEqual(storyframe.description, feature['properties']['description'])
self.assertEqual(storyframe.start_time, feature['properties']['start_time'])
self.assertEqual(storyframe.end_time, feature['properties']['end_time'])
self.assertEqual(storyframe.zoom, feature['properties']['zoom'])
self.assertEqual(eval(storyframe.center), feature['properties']['center'])
self.assertEqual(eval(storyframe.speed), feature['properties']['speed'])


class StoryFramesViewUnitTests(TestCase):
def test_storyframes_get(self):
self.assertIsNotNone(storyframes)

def test_storyframes(self):
try:
boxes()
storyframes()
self.fail("Expected an exception")
except Exception as inst:
self.assertEqual(inst.message, "boxes() takes exactly 2 arguments (0 given)")
self.assertEqual(inst.message, 'storyframes() takes exactly 2 arguments (0 given)')

try:
boxes({},{})
storyframes({}, {})
self.fail("Expected an exception")
except Exception as inst:
self.assertIsNotNone(inst.message)
Expand Down
7 changes: 7 additions & 0 deletions mapstory/apps/storyframes/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.conf.urls import patterns, url


urlpatterns = patterns(
'mapstory.apps.storyframes.views',
url(r'^$', 'storyframes', name='storyframes'),
)
File renamed without changes.
Loading

0 comments on commit e412ca5

Please sign in to comment.