From 796b79c3983516b1bd07afd8bf3f6d3536592109 Mon Sep 17 00:00:00 2001 From: Sean Casey Date: Thu, 7 Apr 2016 18:41:02 +0000 Subject: [PATCH 01/10] Streams can have PhotoItem or TweetItem --- testsite/stream/models.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/testsite/stream/models.py b/testsite/stream/models.py index e10fd24..b4b9d50 100644 --- a/testsite/stream/models.py +++ b/testsite/stream/models.py @@ -1,7 +1,9 @@ from django.db import models from django.contrib.auth.models import User - +from items.models import PhotoItem, TweetItem class Stream(models.Model): user = models.ForeignKey(User) - created_at = models.DateTimeField() \ No newline at end of file + created_at = models.DateTimeField() + photo_item = models.ForeignKey(PhotoItem, blank=True, null=True) + tweet_item = models.ForeignKey(TweetItem, blank=True, null=True) From 5a1a19303f32d14f1b94a93a157bf7d05bcdaef2 Mon Sep 17 00:00:00 2001 From: Sean Casey Date: Thu, 7 Apr 2016 18:41:12 +0000 Subject: [PATCH 02/10] Add some test data fixtures --- testsite/fixtures/test_fixtures.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 testsite/fixtures/test_fixtures.json diff --git a/testsite/fixtures/test_fixtures.json b/testsite/fixtures/test_fixtures.json new file mode 100644 index 0000000..35783b4 --- /dev/null +++ b/testsite/fixtures/test_fixtures.json @@ -0,0 +1 @@ +[{"fields": {"model": "logentry", "name": "log entry", "app_label": "admin"}, "model": "contenttypes.contenttype", "pk": 1}, {"fields": {"model": "permission", "name": "permission", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 2}, {"fields": {"model": "group", "name": "group", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 3}, {"fields": {"model": "user", "name": "user", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 4}, {"fields": {"model": "contenttype", "name": "content type", "app_label": "contenttypes"}, "model": "contenttypes.contenttype", "pk": 5}, {"fields": {"model": "session", "name": "session", "app_label": "sessions"}, "model": "contenttypes.contenttype", "pk": 6}, {"fields": {"model": "stream", "name": "stream", "app_label": "stream"}, "model": "contenttypes.contenttype", "pk": 7}, {"fields": {"model": "photoitem", "name": "photo item", "app_label": "items"}, "model": "contenttypes.contenttype", "pk": 8}, {"fields": {"model": "tweetitem", "name": "tweet item", "app_label": "items"}, "model": "contenttypes.contenttype", "pk": 9}, {"fields": {"expire_date": "2016-04-21T18:18:19.227Z", "session_data": "MzkwYTA0MGZmMDBjMTUyY2NiOWRjNDlkY2ZmOTI4N2ExNTMxNjhkYzp7Il9hdXRoX3VzZXJfaGFzaCI6IjEwMjE5NTgwNDY5MDYwNWU0NWQzMmU4YjdjODhmZmIyM2VhNTVhOGYiLCJfYXV0aF91c2VyX2JhY2tlbmQiOiJkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZCIsIl9hdXRoX3VzZXJfaWQiOjF9"}, "model": "sessions.session", "pk": "x1su0hhwo5dh54f92e0jcykkf6qi8qlc"}, {"fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 1}, "model": "auth.permission", "pk": 1}, {"fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 1}, "model": "auth.permission", "pk": 2}, {"fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 1}, "model": "auth.permission", "pk": 3}, {"fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 2}, "model": "auth.permission", "pk": 4}, {"fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 2}, "model": "auth.permission", "pk": 5}, {"fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 2}, "model": "auth.permission", "pk": 6}, {"fields": {"codename": "add_group", "name": "Can add group", "content_type": 3}, "model": "auth.permission", "pk": 7}, {"fields": {"codename": "change_group", "name": "Can change group", "content_type": 3}, "model": "auth.permission", "pk": 8}, {"fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 3}, "model": "auth.permission", "pk": 9}, {"fields": {"codename": "add_user", "name": "Can add user", "content_type": 4}, "model": "auth.permission", "pk": 10}, {"fields": {"codename": "change_user", "name": "Can change user", "content_type": 4}, "model": "auth.permission", "pk": 11}, {"fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 4}, "model": "auth.permission", "pk": 12}, {"fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 5}, "model": "auth.permission", "pk": 13}, {"fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 5}, "model": "auth.permission", "pk": 14}, {"fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 5}, "model": "auth.permission", "pk": 15}, {"fields": {"codename": "add_session", "name": "Can add session", "content_type": 6}, "model": "auth.permission", "pk": 16}, {"fields": {"codename": "change_session", "name": "Can change session", "content_type": 6}, "model": "auth.permission", "pk": 17}, {"fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 6}, "model": "auth.permission", "pk": 18}, {"fields": {"codename": "add_stream", "name": "Can add stream", "content_type": 7}, "model": "auth.permission", "pk": 19}, {"fields": {"codename": "change_stream", "name": "Can change stream", "content_type": 7}, "model": "auth.permission", "pk": 20}, {"fields": {"codename": "delete_stream", "name": "Can delete stream", "content_type": 7}, "model": "auth.permission", "pk": 21}, {"fields": {"codename": "add_photoitem", "name": "Can add photo item", "content_type": 8}, "model": "auth.permission", "pk": 22}, {"fields": {"codename": "change_photoitem", "name": "Can change photo item", "content_type": 8}, "model": "auth.permission", "pk": 23}, {"fields": {"codename": "delete_photoitem", "name": "Can delete photo item", "content_type": 8}, "model": "auth.permission", "pk": 24}, {"fields": {"codename": "add_tweetitem", "name": "Can add tweet item", "content_type": 9}, "model": "auth.permission", "pk": 25}, {"fields": {"codename": "change_tweetitem", "name": "Can change tweet item", "content_type": 9}, "model": "auth.permission", "pk": 26}, {"fields": {"codename": "delete_tweetitem", "name": "Can delete tweet item", "content_type": 9}, "model": "auth.permission", "pk": 27}, {"fields": {"username": "admin", "first_name": "", "last_name": "", "is_active": true, "is_superuser": true, "is_staff": true, "last_login": "2016-04-07T18:18:19.224Z", "groups": [], "user_permissions": [], "password": "pbkdf2_sha256$12000$3UcNRpsp3RRD$HU5Knq5ArCxeH6Wv8c8URAwGXY97LZNCuCO6NTzl6yo=", "email": "seantcasey@gmail.com", "date_joined": "2016-04-07T18:18:02.516Z"}, "model": "auth.user", "pk": 1}, {"fields": {"created_at": "2016-04-07T18:28:35Z", "photo_item": null, "user": 1, "tweet_item": 3}, "model": "stream.stream", "pk": 3}, {"fields": {"created_at": "2016-04-07T18:29:11Z", "photo_item": null, "user": 1, "tweet_item": 1}, "model": "stream.stream", "pk": 4}, {"fields": {"created_at": "2016-04-07T18:30:58Z", "photo_item": 1, "user": 1, "tweet_item": null}, "model": "stream.stream", "pk": 5}, {"fields": {"created_at": "2016-04-07T18:31:04Z", "user": 1, "image": "./dog-aromatherapy.jpg"}, "model": "items.photoitem", "pk": 1}, {"fields": {"text": "This is a tweet", "created_at": "2016-04-07T18:19:09Z", "user": 1}, "model": "items.tweetitem", "pk": 1}, {"fields": {"text": "This is a tweet", "created_at": "2016-04-07T18:21:33Z", "user": 1}, "model": "items.tweetitem", "pk": 2}, {"fields": {"text": "Another one", "created_at": "2016-04-07T18:21:40Z", "user": 1}, "model": "items.tweetitem", "pk": 3}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:19:10.484Z", "object_repr": "TweetItem object", "object_id": "1", "change_message": "", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 1}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:21:35.148Z", "object_repr": "TweetItem object", "object_id": "2", "change_message": "", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 2}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:21:45.396Z", "object_repr": "TweetItem object", "object_id": "3", "change_message": "", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 3}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:28:43.284Z", "object_repr": "Stream object", "object_id": "3", "change_message": "", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 4}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T18:29:08.073Z", "object_repr": "Stream object", "object_id": "3", "change_message": "Changed tweet_item.", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 5}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:29:13.999Z", "object_repr": "Stream object", "object_id": "4", "change_message": "", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 6}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:31:23.371Z", "object_repr": "PhotoItem object", "object_id": "1", "change_message": "", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 7}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:31:25.486Z", "object_repr": "Stream object", "object_id": "5", "change_message": "", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 8}] \ No newline at end of file From 3b71d611fc78c744baff67f03d34060ec4a93516 Mon Sep 17 00:00:00 2001 From: Sean Casey Date: Thu, 7 Apr 2016 18:51:51 +0000 Subject: [PATCH 03/10] Can flag TweetItems and PhotoItems as deleted --- testsite/items/models.py | 2 ++ testsite/stream/models.py | 10 ++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/testsite/items/models.py b/testsite/items/models.py index 7d7ebe0..f3f7ed7 100644 --- a/testsite/items/models.py +++ b/testsite/items/models.py @@ -12,7 +12,9 @@ class Meta: class PhotoItem(ItemAbstract): image = models.ImageField() + deleted = models.BooleanField(default=False) class TweetItem(ItemAbstract): text = models.CharField(max_length=150) + deleted = models.BooleanField(default=False) diff --git a/testsite/stream/models.py b/testsite/stream/models.py index b4b9d50..8a7983d 100644 --- a/testsite/stream/models.py +++ b/testsite/stream/models.py @@ -5,5 +5,11 @@ class Stream(models.Model): user = models.ForeignKey(User) created_at = models.DateTimeField() - photo_item = models.ForeignKey(PhotoItem, blank=True, null=True) - tweet_item = models.ForeignKey(TweetItem, blank=True, null=True) + photo_item = models.ForeignKey(PhotoItem, + on_delete=models.SET_NULL, + blank=True, + null=True) + tweet_item = models.ForeignKey(TweetItem, + on_delete=models.SET_NULL, + blank=True, + null=True) From 1c17ef9ddb6836a27ae844b5466646921000028f Mon Sep 17 00:00:00 2001 From: Sean Casey Date: Thu, 7 Apr 2016 19:50:03 +0000 Subject: [PATCH 04/10] Add a basic stream view --- testsite/items/models.py | 3 +-- testsite/stream/templates/stream.html | 18 ++++++++++++++++++ testsite/stream/views.py | 21 ++++++++++++++++++++- testsite/testsite/urls.py | 1 + 4 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 testsite/stream/templates/stream.html diff --git a/testsite/items/models.py b/testsite/items/models.py index f3f7ed7..f3ba129 100644 --- a/testsite/items/models.py +++ b/testsite/items/models.py @@ -5,6 +5,7 @@ class ItemAbstract(models.Model): user = models.ForeignKey(User) created_at = models.DateTimeField() + deleted = models.BooleanField(default=False) class Meta: abstract = True @@ -12,9 +13,7 @@ class Meta: class PhotoItem(ItemAbstract): image = models.ImageField() - deleted = models.BooleanField(default=False) class TweetItem(ItemAbstract): text = models.CharField(max_length=150) - deleted = models.BooleanField(default=False) diff --git a/testsite/stream/templates/stream.html b/testsite/stream/templates/stream.html new file mode 100644 index 0000000..b09228e --- /dev/null +++ b/testsite/stream/templates/stream.html @@ -0,0 +1,18 @@ +

Stream Data

+ +
    +{% for stream in stream_data %} + {% if stream.type == 'tweet' %} +
  • +

    Tweet

    + {{ stream.text }} +
  • + {% endif %} + {% if stream.type == 'photo' %} +
  • +

    Image

    + +
  • + {% endif %} +{% endfor %} +
diff --git a/testsite/stream/views.py b/testsite/stream/views.py index 91ea44a..cf81bda 100644 --- a/testsite/stream/views.py +++ b/testsite/stream/views.py @@ -1,3 +1,22 @@ -from django.shortcuts import render +from django.shortcuts import get_list_or_404, render +from stream.models import Stream # Create your views here. +def show_stream(request): + stream_list = get_list_or_404(Stream.objects.order_by('created_at')) + current_stream = [] # Items that are not deleted + + print 'stream_data', stream_list + + for stream in stream_list: + if(stream.tweet_item != None and stream.tweet_item.deleted == False): + print stream.tweet_item.text + print stream.tweet_item.deleted + print type(stream.tweet_item) + current_stream.append({'type': 'tweet', 'text': stream.tweet_item.text}) + + elif(stream.photo_item != None and stream.photo_item.deleted == False): + current_stream.append({'type': 'photo', 'image': stream.photo_item.image}) + + obj = render(request, './stream.html', {'stream_data': current_stream}) + return obj diff --git a/testsite/testsite/urls.py b/testsite/testsite/urls.py index bcd73c7..48352dc 100644 --- a/testsite/testsite/urls.py +++ b/testsite/testsite/urls.py @@ -7,4 +7,5 @@ # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), + url(r'^stream/', 'stream.views.show_stream') ) From 02424eb96b37b10c29428f15977f1f5b62a57df7 Mon Sep 17 00:00:00 2001 From: Sean Casey Date: Thu, 7 Apr 2016 19:50:27 +0000 Subject: [PATCH 05/10] Add a gitignore --- testsite/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 testsite/.gitignore diff --git a/testsite/.gitignore b/testsite/.gitignore new file mode 100644 index 0000000..0d20b64 --- /dev/null +++ b/testsite/.gitignore @@ -0,0 +1 @@ +*.pyc From 31afe1b02cc28439fa0b15f98aa6a34292aafbef Mon Sep 17 00:00:00 2001 From: Sean Casey Date: Thu, 7 Apr 2016 20:13:10 +0000 Subject: [PATCH 06/10] Stream view handles uploaded images --- .../migrations/0002_auto_20160407_1850.py | 26 ++++++++++++++++++ .../migrations/0002_auto_20160407_1813.py | 27 +++++++++++++++++++ .../migrations/0003_auto_20160407_1820.py | 26 ++++++++++++++++++ .../migrations/0004_auto_20160407_1828.py | 26 ++++++++++++++++++ .../migrations/0005_auto_20160407_1850.py | 27 +++++++++++++++++++ testsite/stream/templates/stream.html | 2 +- testsite/stream/views.py | 10 ++++--- testsite/testsite/settings.py | 2 ++ testsite/testsite/urls.py | 7 +++-- 9 files changed, 146 insertions(+), 7 deletions(-) create mode 100644 testsite/items/migrations/0002_auto_20160407_1850.py create mode 100644 testsite/stream/migrations/0002_auto_20160407_1813.py create mode 100644 testsite/stream/migrations/0003_auto_20160407_1820.py create mode 100644 testsite/stream/migrations/0004_auto_20160407_1828.py create mode 100644 testsite/stream/migrations/0005_auto_20160407_1850.py diff --git a/testsite/items/migrations/0002_auto_20160407_1850.py b/testsite/items/migrations/0002_auto_20160407_1850.py new file mode 100644 index 0000000..7da2d4d --- /dev/null +++ b/testsite/items/migrations/0002_auto_20160407_1850.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('items', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='photoitem', + name='deleted', + field=models.BooleanField(default=False), + preserve_default=True, + ), + migrations.AddField( + model_name='tweetitem', + name='deleted', + field=models.BooleanField(default=False), + preserve_default=True, + ), + ] diff --git a/testsite/stream/migrations/0002_auto_20160407_1813.py b/testsite/stream/migrations/0002_auto_20160407_1813.py new file mode 100644 index 0000000..0ecfedc --- /dev/null +++ b/testsite/stream/migrations/0002_auto_20160407_1813.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('items', '0001_initial'), + ('stream', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='stream', + name='photo_item', + field=models.OneToOneField(default=None, to='items.PhotoItem'), + preserve_default=True, + ), + migrations.AddField( + model_name='stream', + name='tweet_item', + field=models.OneToOneField(default=None, to='items.TweetItem'), + preserve_default=True, + ), + ] diff --git a/testsite/stream/migrations/0003_auto_20160407_1820.py b/testsite/stream/migrations/0003_auto_20160407_1820.py new file mode 100644 index 0000000..6e68ea6 --- /dev/null +++ b/testsite/stream/migrations/0003_auto_20160407_1820.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('stream', '0002_auto_20160407_1813'), + ] + + operations = [ + migrations.AlterField( + model_name='stream', + name='photo_item', + field=models.ForeignKey(to='items.PhotoItem'), + preserve_default=True, + ), + migrations.AlterField( + model_name='stream', + name='tweet_item', + field=models.ForeignKey(to='items.TweetItem'), + preserve_default=True, + ), + ] diff --git a/testsite/stream/migrations/0004_auto_20160407_1828.py b/testsite/stream/migrations/0004_auto_20160407_1828.py new file mode 100644 index 0000000..64de52f --- /dev/null +++ b/testsite/stream/migrations/0004_auto_20160407_1828.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('stream', '0003_auto_20160407_1820'), + ] + + operations = [ + migrations.AlterField( + model_name='stream', + name='photo_item', + field=models.ForeignKey(blank=True, to='items.PhotoItem', null=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='stream', + name='tweet_item', + field=models.ForeignKey(blank=True, to='items.TweetItem', null=True), + preserve_default=True, + ), + ] diff --git a/testsite/stream/migrations/0005_auto_20160407_1850.py b/testsite/stream/migrations/0005_auto_20160407_1850.py new file mode 100644 index 0000000..0725299 --- /dev/null +++ b/testsite/stream/migrations/0005_auto_20160407_1850.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('stream', '0004_auto_20160407_1828'), + ] + + operations = [ + migrations.AlterField( + model_name='stream', + name='photo_item', + field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='items.PhotoItem', null=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='stream', + name='tweet_item', + field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='items.TweetItem', null=True), + preserve_default=True, + ), + ] diff --git a/testsite/stream/templates/stream.html b/testsite/stream/templates/stream.html index b09228e..f38fcf5 100644 --- a/testsite/stream/templates/stream.html +++ b/testsite/stream/templates/stream.html @@ -11,7 +11,7 @@

Tweet

{% if stream.type == 'photo' %}
  • Image

    - +
  • {% endif %} {% endfor %} diff --git a/testsite/stream/views.py b/testsite/stream/views.py index cf81bda..862f018 100644 --- a/testsite/stream/views.py +++ b/testsite/stream/views.py @@ -1,5 +1,6 @@ from django.shortcuts import get_list_or_404, render from stream.models import Stream +from django.conf import settings # Create your views here. def show_stream(request): @@ -9,14 +10,15 @@ def show_stream(request): print 'stream_data', stream_list for stream in stream_list: + + # handle tweets if(stream.tweet_item != None and stream.tweet_item.deleted == False): - print stream.tweet_item.text - print stream.tweet_item.deleted - print type(stream.tweet_item) current_stream.append({'type': 'tweet', 'text': stream.tweet_item.text}) + # handle photos elif(stream.photo_item != None and stream.photo_item.deleted == False): - current_stream.append({'type': 'photo', 'image': stream.photo_item.image}) + current_stream.append({'type': 'photo', 'img_href': stream.photo_item.image.url}) + # render HTML from template obj = render(request, './stream.html', {'stream_data': current_stream}) return obj diff --git a/testsite/testsite/settings.py b/testsite/testsite/settings.py index 2821860..1bc60a1 100644 --- a/testsite/testsite/settings.py +++ b/testsite/testsite/settings.py @@ -22,6 +22,8 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True +MEDIA_URL = '/images/' + TEMPLATE_DEBUG = True ALLOWED_HOSTS = [] diff --git a/testsite/testsite/urls.py b/testsite/testsite/urls.py index 48352dc..d07213c 100644 --- a/testsite/testsite/urls.py +++ b/testsite/testsite/urls.py @@ -1,5 +1,7 @@ from django.conf.urls import patterns, include, url from django.contrib import admin +from django.conf import settings +from django.conf.urls.static import static urlpatterns = patterns('', # Examples: @@ -7,5 +9,6 @@ # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), - url(r'^stream/', 'stream.views.show_stream') -) + url(r'^stream/', 'stream.views.show_stream'), + +) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) From 0608ece37e964413f0bbb008c32383456491b9a1 Mon Sep 17 00:00:00 2001 From: Sean Casey Date: Thu, 7 Apr 2016 20:14:01 +0000 Subject: [PATCH 07/10] Add a sample image --- testsite/dog-aromatherapy.jpg | Bin 0 -> 28465 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 testsite/dog-aromatherapy.jpg diff --git a/testsite/dog-aromatherapy.jpg b/testsite/dog-aromatherapy.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c25a4ffb041b86a82588e788aba609181c16625 GIT binary patch literal 28465 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�?IE>tda+ldC~TWE>1A&f;C!$wr(ysIxs zULjR6prKae)czx$1hAta6wB>}l06qI5bFvo(bv-k90 zGQT24T8GY0Fu4)Byh&S&d%VF6`e$Q`j z6B%xv1|{oo4Fbc=1I^s{V>V<2vftDCl>LigPA<-yt?(t!=@GJtSON^aZy$Rhr60+?JU!%$|1K5 z#4(_1jwiqYiu$s;0U>Q;OM8j8Hq7r$){ZJs{*_Om1$b&Ar^^$vOaihoa#J(6Ene!< zS!O|~yBQBHP4`E@U~wXKU627C?KX-MCMYzWF!ux`UN;; zhWva<(z~)3K)VfNOBU&!I@?mMC^hW`K`=vAU&O-kb87m`TXNXe?i=Zz&6 znZTKogjI7O;aAT2+3p$Lp@MS>sb`=A>^K*d30fKWaOqU|(ney_- ziDm6qgB84>J<%oz&3a?+u+L3@jv~P7y5wlSFgHvkoiz0`L|zFP=kYk`&Pw6N0*~D7 zE$!{zS(2hO){ujmgTpTqiva^CqK3LJn_R~F2U|B5(^&f9U^RM}SJu42;BmI?+>v}e zCr^x|SMTCkyI0h7Bg6VFO^>{`ZPM!JYQ0a&H?6J1Tv$%SQx;+pSlr~w;8YGHn8OJ2 zB1=mJGN!?Jdd_;p>IddL!t*8EqWh}|57t+Ns*&k{ za|~(oEJ27I>x)FpgU3%3`3|X9CzA?^jIw|9jeqwY2jk?ZcGb4--Oqi!_t$n#cP{Vl zi`lMws`26JGfL)(5R2}`3aE}X8E63Ut^?%Xw*x?w#7fy2OH=XpC?4hCt@~vgZQB)O z-KA0@bL!|R%B(y?EoOluFLuP{5KjO;5j3lZtb%9C|s` zK=~;-Y?q>CE@_awkE$?mZ6?*%O%vMuMBuWN!@=z!-3nkO4A|no)-Mt$_x7*tA7Pnuk@ z$r#jpNyh86N+JLii|%nd$w$>1Yvqj|;LemTf5G{ONp$t8m-n>j;r{^4$K%RBaj<@` z{mr-k0Fq!G810``(oI?^r~c=s@>l-=hQADHczgDTZ~Hc%(bdp(FKg1vr`FL^r&r5g zE_gbfkB9t}$C5Fz{?PtPXRfryi-_zz74UwDGrhj6rYldU`?@%NwZnYvP54`WsZqCd z{{S%jdj4Uc{SRN{r#_!5_+dq@yZ*`SUA&PrmGsiI%SOK+y2^8{aq1%C35id zr=BAx!tiB+dTX%LPot;Z@#kN+jv#tAibJo8l7mjOqfa_lg?VwskY!w*4(_`2OVrh? zR(ijhpZKOBCuKOYUs-;C`HTKhO3;06fAZ>jnk(g|y!7GEYWJM`UtiDT!3EFuoBf|p z$t=6?>Henc^9uDfj<-smJw++bwA1!sh2HC(%#n?bHoNrk`<9KD{-%Ce{{Z5Cv+}AB zruxk~>6LnQ{94zAdE?Oi<9Z#F?l10GKmPzGf4vL$Z~5=i-2VWU{&V>zm+N#j^mNg6 zbvhYo)AMS@Hh$;)-||%QzjL&^xBYbcvXIOF0H=RfarB={*XYGgg+KE@15S*%>Zg@( zTt9KNcqC_Isc!H5$MRYK0LJ=XSNUvQe^s%%n#-| zzNbh0wd!g9ty%HI7;S7WmwciDQer$5jq0vqVKnxv^>bcyxS}8o%nV`(b5> z=(1vM{Vura)1|D^yf}Xh2Q5(pL{n?@)q|s}`-{@k{I$>QrE7ugS3xr@Iz4~D{?Acq z;i{gm-TU!DT`1pe*VA679-;bOTz{&+(}_jYODSureGL67{{U?C{{ZQ)@x(0AN*blZ z{S{^D*H*bY8u)doojmD^50WY=KR5pXvy-X+0NgK9oO(6RmCxq+v0hu_PmNIpG`7t> zX}X$!zB=EtDt(m2!H}~?lk~c$O?ouTSJ}e^L-ir0qB89|{aiggdi5nbemai|}vblbS?)ij2Wr*E65Pdd{YVBXpANOQZ* GfB)Grcp(J< literal 0 HcmV?d00001 From a57265e8cb913291e5dce2a64b8146f7d0dacb77 Mon Sep 17 00:00:00 2001 From: Sean Casey Date: Thu, 7 Apr 2016 20:28:48 +0000 Subject: [PATCH 08/10] Add timestamps to tweets and photos rendering --- testsite/stream/templates/stream.html | 4 ++-- testsite/stream/views.py | 10 ++++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/testsite/stream/templates/stream.html b/testsite/stream/templates/stream.html index f38fcf5..1a7a179 100644 --- a/testsite/stream/templates/stream.html +++ b/testsite/stream/templates/stream.html @@ -4,13 +4,13 @@

    Stream Data

    {% for stream in stream_data %} {% if stream.type == 'tweet' %}
  • -

    Tweet

    +

    {{ stream.time }} Tweet

    {{ stream.text }}
  • {% endif %} {% if stream.type == 'photo' %}
  • -

    Image

    +

    {{ stream.time }} Image

  • {% endif %} diff --git a/testsite/stream/views.py b/testsite/stream/views.py index 862f018..a30490f 100644 --- a/testsite/stream/views.py +++ b/testsite/stream/views.py @@ -13,11 +13,17 @@ def show_stream(request): # handle tweets if(stream.tweet_item != None and stream.tweet_item.deleted == False): - current_stream.append({'type': 'tweet', 'text': stream.tweet_item.text}) + current_stream.append({ + 'type': 'tweet', + 'text': stream.tweet_item.text, + 'time': str(stream.created_at)}) # handle photos elif(stream.photo_item != None and stream.photo_item.deleted == False): - current_stream.append({'type': 'photo', 'img_href': stream.photo_item.image.url}) + current_stream.append({ + 'type': 'photo', + 'img_href': stream.photo_item.image.url, + 'time': str(stream.created_at)}) # render HTML from template obj = render(request, './stream.html', {'stream_data': current_stream}) From 8c254fa4323549000087eacddb3fe506d07ec6ec Mon Sep 17 00:00:00 2001 From: Sean Casey Date: Thu, 7 Apr 2016 20:31:41 +0000 Subject: [PATCH 09/10] Export fixtures to json dump --- testsite/fixtures/test_fixtures.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsite/fixtures/test_fixtures.json b/testsite/fixtures/test_fixtures.json index 35783b4..d5bd655 100644 --- a/testsite/fixtures/test_fixtures.json +++ b/testsite/fixtures/test_fixtures.json @@ -1 +1 @@ -[{"fields": {"model": "logentry", "name": "log entry", "app_label": "admin"}, "model": "contenttypes.contenttype", "pk": 1}, {"fields": {"model": "permission", "name": "permission", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 2}, {"fields": {"model": "group", "name": "group", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 3}, {"fields": {"model": "user", "name": "user", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 4}, {"fields": {"model": "contenttype", "name": "content type", "app_label": "contenttypes"}, "model": "contenttypes.contenttype", "pk": 5}, {"fields": {"model": "session", "name": "session", "app_label": "sessions"}, "model": "contenttypes.contenttype", "pk": 6}, {"fields": {"model": "stream", "name": "stream", "app_label": "stream"}, "model": "contenttypes.contenttype", "pk": 7}, {"fields": {"model": "photoitem", "name": "photo item", "app_label": "items"}, "model": "contenttypes.contenttype", "pk": 8}, {"fields": {"model": "tweetitem", "name": "tweet item", "app_label": "items"}, "model": "contenttypes.contenttype", "pk": 9}, {"fields": {"expire_date": "2016-04-21T18:18:19.227Z", "session_data": "MzkwYTA0MGZmMDBjMTUyY2NiOWRjNDlkY2ZmOTI4N2ExNTMxNjhkYzp7Il9hdXRoX3VzZXJfaGFzaCI6IjEwMjE5NTgwNDY5MDYwNWU0NWQzMmU4YjdjODhmZmIyM2VhNTVhOGYiLCJfYXV0aF91c2VyX2JhY2tlbmQiOiJkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZCIsIl9hdXRoX3VzZXJfaWQiOjF9"}, "model": "sessions.session", "pk": "x1su0hhwo5dh54f92e0jcykkf6qi8qlc"}, {"fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 1}, "model": "auth.permission", "pk": 1}, {"fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 1}, "model": "auth.permission", "pk": 2}, {"fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 1}, "model": "auth.permission", "pk": 3}, {"fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 2}, "model": "auth.permission", "pk": 4}, {"fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 2}, "model": "auth.permission", "pk": 5}, {"fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 2}, "model": "auth.permission", "pk": 6}, {"fields": {"codename": "add_group", "name": "Can add group", "content_type": 3}, "model": "auth.permission", "pk": 7}, {"fields": {"codename": "change_group", "name": "Can change group", "content_type": 3}, "model": "auth.permission", "pk": 8}, {"fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 3}, "model": "auth.permission", "pk": 9}, {"fields": {"codename": "add_user", "name": "Can add user", "content_type": 4}, "model": "auth.permission", "pk": 10}, {"fields": {"codename": "change_user", "name": "Can change user", "content_type": 4}, "model": "auth.permission", "pk": 11}, {"fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 4}, "model": "auth.permission", "pk": 12}, {"fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 5}, "model": "auth.permission", "pk": 13}, {"fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 5}, "model": "auth.permission", "pk": 14}, {"fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 5}, "model": "auth.permission", "pk": 15}, {"fields": {"codename": "add_session", "name": "Can add session", "content_type": 6}, "model": "auth.permission", "pk": 16}, {"fields": {"codename": "change_session", "name": "Can change session", "content_type": 6}, "model": "auth.permission", "pk": 17}, {"fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 6}, "model": "auth.permission", "pk": 18}, {"fields": {"codename": "add_stream", "name": "Can add stream", "content_type": 7}, "model": "auth.permission", "pk": 19}, {"fields": {"codename": "change_stream", "name": "Can change stream", "content_type": 7}, "model": "auth.permission", "pk": 20}, {"fields": {"codename": "delete_stream", "name": "Can delete stream", "content_type": 7}, "model": "auth.permission", "pk": 21}, {"fields": {"codename": "add_photoitem", "name": "Can add photo item", "content_type": 8}, "model": "auth.permission", "pk": 22}, {"fields": {"codename": "change_photoitem", "name": "Can change photo item", "content_type": 8}, "model": "auth.permission", "pk": 23}, {"fields": {"codename": "delete_photoitem", "name": "Can delete photo item", "content_type": 8}, "model": "auth.permission", "pk": 24}, {"fields": {"codename": "add_tweetitem", "name": "Can add tweet item", "content_type": 9}, "model": "auth.permission", "pk": 25}, {"fields": {"codename": "change_tweetitem", "name": "Can change tweet item", "content_type": 9}, "model": "auth.permission", "pk": 26}, {"fields": {"codename": "delete_tweetitem", "name": "Can delete tweet item", "content_type": 9}, "model": "auth.permission", "pk": 27}, {"fields": {"username": "admin", "first_name": "", "last_name": "", "is_active": true, "is_superuser": true, "is_staff": true, "last_login": "2016-04-07T18:18:19.224Z", "groups": [], "user_permissions": [], "password": "pbkdf2_sha256$12000$3UcNRpsp3RRD$HU5Knq5ArCxeH6Wv8c8URAwGXY97LZNCuCO6NTzl6yo=", "email": "seantcasey@gmail.com", "date_joined": "2016-04-07T18:18:02.516Z"}, "model": "auth.user", "pk": 1}, {"fields": {"created_at": "2016-04-07T18:28:35Z", "photo_item": null, "user": 1, "tweet_item": 3}, "model": "stream.stream", "pk": 3}, {"fields": {"created_at": "2016-04-07T18:29:11Z", "photo_item": null, "user": 1, "tweet_item": 1}, "model": "stream.stream", "pk": 4}, {"fields": {"created_at": "2016-04-07T18:30:58Z", "photo_item": 1, "user": 1, "tweet_item": null}, "model": "stream.stream", "pk": 5}, {"fields": {"created_at": "2016-04-07T18:31:04Z", "user": 1, "image": "./dog-aromatherapy.jpg"}, "model": "items.photoitem", "pk": 1}, {"fields": {"text": "This is a tweet", "created_at": "2016-04-07T18:19:09Z", "user": 1}, "model": "items.tweetitem", "pk": 1}, {"fields": {"text": "This is a tweet", "created_at": "2016-04-07T18:21:33Z", "user": 1}, "model": "items.tweetitem", "pk": 2}, {"fields": {"text": "Another one", "created_at": "2016-04-07T18:21:40Z", "user": 1}, "model": "items.tweetitem", "pk": 3}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:19:10.484Z", "object_repr": "TweetItem object", "object_id": "1", "change_message": "", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 1}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:21:35.148Z", "object_repr": "TweetItem object", "object_id": "2", "change_message": "", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 2}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:21:45.396Z", "object_repr": "TweetItem object", "object_id": "3", "change_message": "", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 3}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:28:43.284Z", "object_repr": "Stream object", "object_id": "3", "change_message": "", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 4}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T18:29:08.073Z", "object_repr": "Stream object", "object_id": "3", "change_message": "Changed tweet_item.", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 5}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:29:13.999Z", "object_repr": "Stream object", "object_id": "4", "change_message": "", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 6}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:31:23.371Z", "object_repr": "PhotoItem object", "object_id": "1", "change_message": "", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 7}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:31:25.486Z", "object_repr": "Stream object", "object_id": "5", "change_message": "", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 8}] \ No newline at end of file +[{"fields": {"model": "logentry", "name": "log entry", "app_label": "admin"}, "model": "contenttypes.contenttype", "pk": 1}, {"fields": {"model": "permission", "name": "permission", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 2}, {"fields": {"model": "group", "name": "group", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 3}, {"fields": {"model": "user", "name": "user", "app_label": "auth"}, "model": "contenttypes.contenttype", "pk": 4}, {"fields": {"model": "contenttype", "name": "content type", "app_label": "contenttypes"}, "model": "contenttypes.contenttype", "pk": 5}, {"fields": {"model": "session", "name": "session", "app_label": "sessions"}, "model": "contenttypes.contenttype", "pk": 6}, {"fields": {"model": "stream", "name": "stream", "app_label": "stream"}, "model": "contenttypes.contenttype", "pk": 7}, {"fields": {"model": "photoitem", "name": "photo item", "app_label": "items"}, "model": "contenttypes.contenttype", "pk": 8}, {"fields": {"model": "tweetitem", "name": "tweet item", "app_label": "items"}, "model": "contenttypes.contenttype", "pk": 9}, {"fields": {"expire_date": "2016-04-21T18:18:19.227Z", "session_data": "MzkwYTA0MGZmMDBjMTUyY2NiOWRjNDlkY2ZmOTI4N2ExNTMxNjhkYzp7Il9hdXRoX3VzZXJfaGFzaCI6IjEwMjE5NTgwNDY5MDYwNWU0NWQzMmU4YjdjODhmZmIyM2VhNTVhOGYiLCJfYXV0aF91c2VyX2JhY2tlbmQiOiJkamFuZ28uY29udHJpYi5hdXRoLmJhY2tlbmRzLk1vZGVsQmFja2VuZCIsIl9hdXRoX3VzZXJfaWQiOjF9"}, "model": "sessions.session", "pk": "x1su0hhwo5dh54f92e0jcykkf6qi8qlc"}, {"fields": {"codename": "add_logentry", "name": "Can add log entry", "content_type": 1}, "model": "auth.permission", "pk": 1}, {"fields": {"codename": "change_logentry", "name": "Can change log entry", "content_type": 1}, "model": "auth.permission", "pk": 2}, {"fields": {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 1}, "model": "auth.permission", "pk": 3}, {"fields": {"codename": "add_permission", "name": "Can add permission", "content_type": 2}, "model": "auth.permission", "pk": 4}, {"fields": {"codename": "change_permission", "name": "Can change permission", "content_type": 2}, "model": "auth.permission", "pk": 5}, {"fields": {"codename": "delete_permission", "name": "Can delete permission", "content_type": 2}, "model": "auth.permission", "pk": 6}, {"fields": {"codename": "add_group", "name": "Can add group", "content_type": 3}, "model": "auth.permission", "pk": 7}, {"fields": {"codename": "change_group", "name": "Can change group", "content_type": 3}, "model": "auth.permission", "pk": 8}, {"fields": {"codename": "delete_group", "name": "Can delete group", "content_type": 3}, "model": "auth.permission", "pk": 9}, {"fields": {"codename": "add_user", "name": "Can add user", "content_type": 4}, "model": "auth.permission", "pk": 10}, {"fields": {"codename": "change_user", "name": "Can change user", "content_type": 4}, "model": "auth.permission", "pk": 11}, {"fields": {"codename": "delete_user", "name": "Can delete user", "content_type": 4}, "model": "auth.permission", "pk": 12}, {"fields": {"codename": "add_contenttype", "name": "Can add content type", "content_type": 5}, "model": "auth.permission", "pk": 13}, {"fields": {"codename": "change_contenttype", "name": "Can change content type", "content_type": 5}, "model": "auth.permission", "pk": 14}, {"fields": {"codename": "delete_contenttype", "name": "Can delete content type", "content_type": 5}, "model": "auth.permission", "pk": 15}, {"fields": {"codename": "add_session", "name": "Can add session", "content_type": 6}, "model": "auth.permission", "pk": 16}, {"fields": {"codename": "change_session", "name": "Can change session", "content_type": 6}, "model": "auth.permission", "pk": 17}, {"fields": {"codename": "delete_session", "name": "Can delete session", "content_type": 6}, "model": "auth.permission", "pk": 18}, {"fields": {"codename": "add_stream", "name": "Can add stream", "content_type": 7}, "model": "auth.permission", "pk": 19}, {"fields": {"codename": "change_stream", "name": "Can change stream", "content_type": 7}, "model": "auth.permission", "pk": 20}, {"fields": {"codename": "delete_stream", "name": "Can delete stream", "content_type": 7}, "model": "auth.permission", "pk": 21}, {"fields": {"codename": "add_photoitem", "name": "Can add photo item", "content_type": 8}, "model": "auth.permission", "pk": 22}, {"fields": {"codename": "change_photoitem", "name": "Can change photo item", "content_type": 8}, "model": "auth.permission", "pk": 23}, {"fields": {"codename": "delete_photoitem", "name": "Can delete photo item", "content_type": 8}, "model": "auth.permission", "pk": 24}, {"fields": {"codename": "add_tweetitem", "name": "Can add tweet item", "content_type": 9}, "model": "auth.permission", "pk": 25}, {"fields": {"codename": "change_tweetitem", "name": "Can change tweet item", "content_type": 9}, "model": "auth.permission", "pk": 26}, {"fields": {"codename": "delete_tweetitem", "name": "Can delete tweet item", "content_type": 9}, "model": "auth.permission", "pk": 27}, {"fields": {"username": "admin", "first_name": "", "last_name": "", "is_active": true, "is_superuser": true, "is_staff": true, "last_login": "2016-04-07T18:18:19.224Z", "groups": [], "user_permissions": [], "password": "pbkdf2_sha256$12000$3UcNRpsp3RRD$HU5Knq5ArCxeH6Wv8c8URAwGXY97LZNCuCO6NTzl6yo=", "email": "seantcasey@gmail.com", "date_joined": "2016-04-07T18:18:02.516Z"}, "model": "auth.user", "pk": 1}, {"fields": {"created_at": "2016-04-07T18:28:35Z", "photo_item": null, "user": 1, "tweet_item": 3}, "model": "stream.stream", "pk": 3}, {"fields": {"created_at": "2016-04-07T18:29:11Z", "photo_item": null, "user": 1, "tweet_item": 1}, "model": "stream.stream", "pk": 4}, {"fields": {"created_at": "2016-04-07T18:46:09Z", "photo_item": 3, "user": 1, "tweet_item": null}, "model": "stream.stream", "pk": 6}, {"fields": {"created_at": "2016-04-07T20:28:04Z", "photo_item": null, "user": 1, "tweet_item": 4}, "model": "stream.stream", "pk": 7}, {"fields": {"deleted": false, "created_at": "2016-04-07T18:50:23Z", "user": 1, "image": "./dog-aromatherapy.jpg"}, "model": "items.photoitem", "pk": 3}, {"fields": {"deleted": false, "text": "This is a tweet", "created_at": "2016-04-07T18:19:09Z", "user": 1}, "model": "items.tweetitem", "pk": 1}, {"fields": {"deleted": true, "text": "This is a tweet", "created_at": "2016-04-07T18:21:33Z", "user": 1}, "model": "items.tweetitem", "pk": 2}, {"fields": {"deleted": false, "text": "Another one", "created_at": "2016-04-07T18:21:40Z", "user": 1}, "model": "items.tweetitem", "pk": 3}, {"fields": {"deleted": false, "text": "Doing a coding test!", "created_at": "2016-04-07T20:27:37Z", "user": 1}, "model": "items.tweetitem", "pk": 4}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:19:10.484Z", "object_repr": "TweetItem object", "object_id": "1", "change_message": "", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 1}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:21:35.148Z", "object_repr": "TweetItem object", "object_id": "2", "change_message": "", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 2}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:21:45.396Z", "object_repr": "TweetItem object", "object_id": "3", "change_message": "", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 3}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:28:43.284Z", "object_repr": "Stream object", "object_id": "3", "change_message": "", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 4}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T18:29:08.073Z", "object_repr": "Stream object", "object_id": "3", "change_message": "Changed tweet_item.", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 5}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:29:13.999Z", "object_repr": "Stream object", "object_id": "4", "change_message": "", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 6}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:31:23.371Z", "object_repr": "PhotoItem object", "object_id": "1", "change_message": "", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 7}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:31:25.486Z", "object_repr": "Stream object", "object_id": "5", "change_message": "", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 8}, {"fields": {"action_flag": 3, "action_time": "2016-04-07T18:42:55.798Z", "object_repr": "PhotoItem object", "object_id": "1", "change_message": "", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 9}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:46:21.218Z", "object_repr": "PhotoItem object", "object_id": "2", "change_message": "", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 10}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:46:23.068Z", "object_repr": "Stream object", "object_id": "6", "change_message": "", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 11}, {"fields": {"action_flag": 3, "action_time": "2016-04-07T18:46:37.489Z", "object_repr": "PhotoItem object", "object_id": "2", "change_message": "", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 12}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T18:50:28.284Z", "object_repr": "PhotoItem object", "object_id": "3", "change_message": "", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 13}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T18:50:39.943Z", "object_repr": "Stream object", "object_id": "6", "change_message": "Changed photo_item.", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 14}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T20:09:09.302Z", "object_repr": "PhotoItem object", "object_id": "3", "change_message": "Changed deleted.", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 15}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T20:09:14.830Z", "object_repr": "PhotoItem object", "object_id": "3", "change_message": "Changed deleted.", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 16}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T20:09:29.844Z", "object_repr": "TweetItem object", "object_id": "2", "change_message": "Changed deleted.", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 17}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T20:10:12.245Z", "object_repr": "TweetItem object", "object_id": "3", "change_message": "Changed deleted.", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 18}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T20:10:17.465Z", "object_repr": "TweetItem object", "object_id": "3", "change_message": "Changed deleted.", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 19}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T20:13:43.505Z", "object_repr": "PhotoItem object", "object_id": "3", "change_message": "Changed image.", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 20}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T20:14:24.245Z", "object_repr": "PhotoItem object", "object_id": "3", "change_message": "Changed deleted.", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 21}, {"fields": {"action_flag": 2, "action_time": "2016-04-07T20:14:30.493Z", "object_repr": "PhotoItem object", "object_id": "3", "change_message": "Changed deleted.", "user": 1, "content_type": 8}, "model": "admin.logentry", "pk": 22}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T20:27:46.869Z", "object_repr": "TweetItem object", "object_id": "4", "change_message": "", "user": 1, "content_type": 9}, "model": "admin.logentry", "pk": 23}, {"fields": {"action_flag": 1, "action_time": "2016-04-07T20:28:08.373Z", "object_repr": "Stream object", "object_id": "7", "change_message": "", "user": 1, "content_type": 7}, "model": "admin.logentry", "pk": 24}] \ No newline at end of file From 094d006199dae0d9cb46da1e7d36a181499e644a Mon Sep 17 00:00:00 2001 From: Sean Casey Date: Thu, 7 Apr 2016 20:36:02 +0000 Subject: [PATCH 10/10] Make a fabric command that clears the database and loads your sample data --- fabfile.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fabfile.py b/fabfile.py index 18a53bb..c6fd1c1 100644 --- a/fabfile.py +++ b/fabfile.py @@ -15,4 +15,9 @@ def make_migrations(): run_manage('makemigrations') def requirements(): - local('/home/vagrant/.virtualenvs/le-code-test/bin/pip install -r requirements.txt ') \ No newline at end of file + local('/home/vagrant/.virtualenvs/le-code-test/bin/pip install -r requirements.txt ') + +# clear down DB and load sample fixtures +def load_sample_data(): + run_manage('flush') # prompts for confirmation + run_manage('loaddata fixtures/test_fixtures.json')