From b3d8cea17c3d1848adad2d4c8cc266b810fae83a Mon Sep 17 00:00:00 2001 From: LS80 Date: Mon, 5 Oct 2015 15:39:24 +0100 Subject: [PATCH 1/6] Updated the Stream model so it can have a PhotoItem or a TweetItem. --- .../migrations/0002_auto_20151005_1926.py | 31 +++++++++++++++++++ testsite/stream/models.py | 26 +++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 testsite/stream/migrations/0002_auto_20151005_1926.py diff --git a/testsite/stream/migrations/0002_auto_20151005_1926.py b/testsite/stream/migrations/0002_auto_20151005_1926.py new file mode 100644 index 0000000..d598f0a --- /dev/null +++ b/testsite/stream/migrations/0002_auto_20151005_1926.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0001_initial'), + ('stream', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='stream', + options={'ordering': ['-created_at']}, + ), + migrations.AddField( + model_name='stream', + name='content_type', + field=models.ForeignKey(default=36, to='contenttypes.ContentType'), + preserve_default=False, + ), + migrations.AddField( + model_name='stream', + name='object_id', + field=models.PositiveIntegerField(default=1), + preserve_default=False, + ), + ] diff --git a/testsite/stream/models.py b/testsite/stream/models.py index e10fd24..3d05c82 100644 --- a/testsite/stream/models.py +++ b/testsite/stream/models.py @@ -1,7 +1,31 @@ from django.db import models from django.contrib.auth.models import User +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.db.models import signals + +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() + + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + content_object = GenericForeignKey() + + class Meta: + ordering = ['-created_at'] + + +def update_stream(sender, instance, created, **kwargs): + if created: + Stream.objects.create( + user=instance.user, + created_at=instance.created_at, + content_type=ContentType.objects.get_for_model(sender), + object_id=instance.id) + +for item_type in (TweetItem, PhotoItem): + signals.post_save.connect(update_stream, sender=item_type) \ No newline at end of file From 2b9f43ae33157d924d0515ae63b094f92556ee3f Mon Sep 17 00:00:00 2001 From: LS80 Date: Mon, 5 Oct 2015 15:44:10 +0100 Subject: [PATCH 2/6] Made a page that shows the stream items in chronological order. --- testsite/stream/views.py | 6 +++++- testsite/testsite/settings.py | 6 ++++++ testsite/testsite/templates/stream.html | 28 +++++++++++++++++++++++++ testsite/testsite/urls.py | 11 +++++++--- 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 testsite/testsite/templates/stream.html diff --git a/testsite/stream/views.py b/testsite/stream/views.py index 91ea44a..1735b3a 100644 --- a/testsite/stream/views.py +++ b/testsite/stream/views.py @@ -1,3 +1,7 @@ from django.shortcuts import render -# Create your views here. +from models import Stream + +def stream(request): + return render(request, 'stream.html', + {'stream': Stream.objects.all()}) diff --git a/testsite/testsite/settings.py b/testsite/testsite/settings.py index 2821860..21f85bd 100644 --- a/testsite/testsite/settings.py +++ b/testsite/testsite/settings.py @@ -66,6 +66,10 @@ } } +TEMPLATE_DIRS = ( + os.path.join(BASE_DIR, 'testsite', 'templates'), +) + # Internationalization # https://docs.djangoproject.com/en/1.7/topics/i18n/ @@ -84,3 +88,5 @@ # https://docs.djangoproject.com/en/1.7/howto/static-files/ STATIC_URL = '/static/' + +MEDIA_URL = '/media/' diff --git a/testsite/testsite/templates/stream.html b/testsite/testsite/templates/stream.html new file mode 100644 index 0000000..d4b3073 --- /dev/null +++ b/testsite/testsite/templates/stream.html @@ -0,0 +1,28 @@ + + + + Stream Page + + + + +
+ {% for item in stream %} +
+
+
+ {% if item.content_type.model == 'photoitem' %} + + {% elif item.content_type.model == 'tweetitem' %} +

{{ item.content_object.text }}

+ {% endif %} +
    +
  • {{ item.created_at }}
  • +
+
+
+
+ {% endfor %} +
+ + \ No newline at end of file diff --git a/testsite/testsite/urls.py b/testsite/testsite/urls.py index bcd73c7..b93c51a 100644 --- a/testsite/testsite/urls.py +++ b/testsite/testsite/urls.py @@ -1,10 +1,15 @@ -from django.conf.urls import patterns, include, url +from django.conf.urls import include, url from django.contrib import admin +from django.conf import settings +from django.conf.urls.static import static -urlpatterns = patterns('', +from stream import views + +urlpatterns = [ # Examples: # url(r'^$', 'testsite.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), -) + url(r'^stream/', views.stream) +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) From 55bede52ee0c9338bb6a3ad2ec3d1196de3c624a Mon Sep 17 00:00:00 2001 From: LS80 Date: Mon, 5 Oct 2015 18:34:51 +0100 Subject: [PATCH 3/6] Made it possible to delete/undelete items from the stream using the admin. --- .../stream/migrations/0003_stream_deleted.py | 20 +++++++++++++++++++ testsite/stream/models.py | 15 ++++++++++++++ testsite/stream/views.py | 2 +- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 testsite/stream/migrations/0003_stream_deleted.py diff --git a/testsite/stream/migrations/0003_stream_deleted.py b/testsite/stream/migrations/0003_stream_deleted.py new file mode 100644 index 0000000..bc449e8 --- /dev/null +++ b/testsite/stream/migrations/0003_stream_deleted.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('stream', '0002_auto_20151005_1926'), + ] + + operations = [ + migrations.AddField( + model_name='stream', + name='deleted', + field=models.BooleanField(default=False), + preserve_default=True, + ), + ] diff --git a/testsite/stream/models.py b/testsite/stream/models.py index 3d05c82..082d7bd 100644 --- a/testsite/stream/models.py +++ b/testsite/stream/models.py @@ -7,6 +7,11 @@ from items.models import PhotoItem, TweetItem +class NotDeletedStreamManager(models.Manager): + def get_queryset(self): + return super(NotDeletedStreamManager, self).get_queryset().filter(deleted=False) + + class Stream(models.Model): user = models.ForeignKey(User) created_at = models.DateTimeField() @@ -15,9 +20,19 @@ class Stream(models.Model): object_id = models.PositiveIntegerField() content_object = GenericForeignKey() + deleted = models.BooleanField(default=False) + class Meta: ordering = ['-created_at'] + objects = models.Manager() + active = NotDeletedStreamManager() + + def __unicode__(self): + return '{} {}: {}'.format(self.__class__.__name__, + self.content_type.model, + self.created_at) + def update_stream(sender, instance, created, **kwargs): if created: diff --git a/testsite/stream/views.py b/testsite/stream/views.py index 1735b3a..664421c 100644 --- a/testsite/stream/views.py +++ b/testsite/stream/views.py @@ -4,4 +4,4 @@ def stream(request): return render(request, 'stream.html', - {'stream': Stream.objects.all()}) + {'stream': Stream.active.all()}) From 22f8693497abf63427fbd1cbb055dbffce265013 Mon Sep 17 00:00:00 2001 From: LS80 Date: Mon, 5 Oct 2015 18:41:20 +0100 Subject: [PATCH 4/6] Added a sample data fixture. --- testsite/items/fixtures/sample_data.json | 47 ++++++++++++++++++ .../python-logo-master-v3-TM-flattened.png | Bin 0 -> 11155 bytes testsite/testsite/settings.py | 2 + 3 files changed, 49 insertions(+) create mode 100644 testsite/items/fixtures/sample_data.json create mode 100644 testsite/media/python-logo-master-v3-TM-flattened.png diff --git a/testsite/items/fixtures/sample_data.json b/testsite/items/fixtures/sample_data.json new file mode 100644 index 0000000..93f6889 --- /dev/null +++ b/testsite/items/fixtures/sample_data.json @@ -0,0 +1,47 @@ +[ +{ + "fields": { + "created_at": "2015-10-05T12:21:06Z", + "user": 1, + "image": "/media/python-logo-master-v3-TM-flattened.png" + }, + "model": "items.photoitem", + "pk": 1 +}, +{ + "fields": { + "created_at": "2015-10-03T13:06:14Z", + "user": 1, + "image": "/media/python-logo-master-v3-TM-flattened.png" + }, + "model": "items.photoitem", + "pk": 2 +}, +{ + "fields": { + "text": "Had corn flakes for breakfast", + "created_at": "2015-10-02T08:10:10Z", + "user": 1 + }, + "model": "items.tweetitem", + "pk": 1 +}, +{ + "fields": { + "text": "Had salmon for lunch today", + "created_at": "2015-10-04T12:54:43Z", + "user": 1 + }, + "model": "items.tweetitem", + "pk": 2 +}, +{ + "fields": { + "text": "Had a roast beef dinner", + "created_at": "2015-10-04T18:41:47Z", + "user": 1 + }, + "model": "items.tweetitem", + "pk": 3 +} +] diff --git a/testsite/media/python-logo-master-v3-TM-flattened.png b/testsite/media/python-logo-master-v3-TM-flattened.png new file mode 100644 index 0000000000000000000000000000000000000000..738f6ed41f499d1f57fd4db356dc1d64769bf725 GIT binary patch literal 11155 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 Date: Mon, 5 Oct 2015 19:59:16 +0100 Subject: [PATCH 5/6] Added an auth_data fixture to load the test admin user. --- testsite/testsite/fixtures/auth_data.json | 263 ++++++++++++++++++++++ testsite/testsite/settings.py | 4 + 2 files changed, 267 insertions(+) create mode 100644 testsite/testsite/fixtures/auth_data.json diff --git a/testsite/testsite/fixtures/auth_data.json b/testsite/testsite/fixtures/auth_data.json new file mode 100644 index 0000000..7b2d40f --- /dev/null +++ b/testsite/testsite/fixtures/auth_data.json @@ -0,0 +1,263 @@ +[ +{ + "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": "2015-10-05T18:54:02.247Z", + "groups": [], + "user_permissions": [], + "password": "pbkdf2_sha256$12000$1THWo6CjRL0S$OKr+1Fil+oUQZ8c3LWZm+FEX69V3bzHRenCI9XApyqY=", + "email": "", + "date_joined": "2015-10-05T18:54:02.247Z" + }, + "model": "auth.user", + "pk": 1 +} +] diff --git a/testsite/testsite/settings.py b/testsite/testsite/settings.py index 7b97601..31cfe7b 100644 --- a/testsite/testsite/settings.py +++ b/testsite/testsite/settings.py @@ -70,6 +70,10 @@ os.path.join(BASE_DIR, 'testsite', 'templates'), ) +FIXTURE_DIRS = ( + os.path.join(os.path.dirname(__file__), 'fixtures'), +) + # Internationalization # https://docs.djangoproject.com/en/1.7/topics/i18n/ From 73ba96a8f1b5b6daa099f2c0821870ef38a6bd34 Mon Sep 17 00:00:00 2001 From: LS80 Date: Mon, 5 Oct 2015 20:32:24 +0100 Subject: [PATCH 6/6] Added a fabric command to clear the database and load sample data. --- fabfile.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fabfile.py b/fabfile.py index 18a53bb..756846c 100644 --- a/fabfile.py +++ b/fabfile.py @@ -14,5 +14,10 @@ def migrate(): def make_migrations(): run_manage('makemigrations') +def load_sample_data(): + run_manage('flush') + run_manage('loaddata auth_data') + run_manage('loaddata sample_data') + def requirements(): local('/home/vagrant/.virtualenvs/le-code-test/bin/pip install -r requirements.txt ') \ No newline at end of file