From 2bbaf48ab7c8a94b53f1f191449a2f525dce62f3 Mon Sep 17 00:00:00 2001 From: Dylan Evans Date: Fri, 9 Sep 2016 15:41:55 +0100 Subject: [PATCH 01/11] Add basic models The Adventure model is currently very minimal. It does not track things like the items, monsters or NPCs in an adventure. --- server/adventures/models.py | 42 ++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/server/adventures/models.py b/server/adventures/models.py index 71a8362..b7a5011 100644 --- a/server/adventures/models.py +++ b/server/adventures/models.py @@ -1,3 +1,43 @@ from django.db import models -# Create your models here. + +class Author(models.Model): + name = models.TextField() + + def __str__(self): + return self.name + + +class Publisher(models.Model): + name = models.TextField() + + def __str__(self): + return self.name + + +class Edition(models.Model): + name = models.TextField() + + def __str__(self): + return self.name + + +class Adventure(models.Model): + created = models.DateTimeField(auto_now_add=True) + last_modified = models.DateTimeField(auto_now=True) + + title = models.TextField() + edition = models.ForeignKey(Edition) + authors = models.ManyToManyField(Author) + edition = models.ForeignKey(Publisher) + published = models.DateField() + min_level = models.IntegerField(help_text=('The minumum character level ' + 'for the adventure')) + max_level = models.IntegerField(help_text=('The maximum character level ' + 'for the adventure')) + min_characters = models.IntegerField(help_text=('The minumum number of ' + 'charactersfor the ' + 'adventure')) + max_characters = models.IntegerField(help_text=('The maximum number of ' + 'charactersfor the ' + 'adventure')) From bcfcfdc535ff738b74074f1e17523c92bec226e3 Mon Sep 17 00:00:00 2001 From: Dylan Evans Date: Fri, 9 Sep 2016 18:12:03 +0100 Subject: [PATCH 02/11] Add migrations --- server/adventures/migrations/0001_initial.py | 62 ++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 server/adventures/migrations/0001_initial.py diff --git a/server/adventures/migrations/0001_initial.py b/server/adventures/migrations/0001_initial.py new file mode 100644 index 0000000..53c2f23 --- /dev/null +++ b/server/adventures/migrations/0001_initial.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-09-09 17:05 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Adventure', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True)), + ('last_modified', models.DateTimeField(auto_now=True)), + ('title', models.TextField()), + ('published', models.DateField()), + ('min_level', models.IntegerField(help_text='The minumum character level for the adventure')), + ('max_level', models.IntegerField(help_text='The maximum character level for the adventure')), + ('min_characters', models.IntegerField(help_text='The minumum number of charactersfor the adventure')), + ('max_characters', models.IntegerField(help_text='The maximum number of charactersfor the adventure')), + ], + ), + migrations.CreateModel( + name='Author', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField()), + ], + ), + migrations.CreateModel( + name='Edition', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField()), + ], + ), + migrations.CreateModel( + name='Publisher', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField()), + ], + ), + migrations.AddField( + model_name='adventure', + name='authors', + field=models.ManyToManyField(to='adventures.Author'), + ), + migrations.AddField( + model_name='adventure', + name='edition', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='adventures.Publisher'), + ), + ] From 22adbba379b5c6b0db12fdfb1c7a466d7d89e7bd Mon Sep 17 00:00:00 2001 From: Dylan Evans Date: Fri, 9 Sep 2016 19:23:49 +0100 Subject: [PATCH 03/11] Add setting attribute to Adventure model --- server/adventures/models.py | 11 ++++++++++- server/adventures/tests.py | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/server/adventures/models.py b/server/adventures/models.py index b7a5011..82827a6 100644 --- a/server/adventures/models.py +++ b/server/adventures/models.py @@ -22,15 +22,24 @@ def __str__(self): return self.name +class Setting(models.Model): + name = models.TextField() + + def __str__(self): + return self.name + + class Adventure(models.Model): created = models.DateTimeField(auto_now_add=True) last_modified = models.DateTimeField(auto_now=True) title = models.TextField() + description edition = models.ForeignKey(Edition) authors = models.ManyToManyField(Author) - edition = models.ForeignKey(Publisher) + publisher = models.ForeignKey(Publisher) published = models.DateField() + setting = models.ForeignKey(Setting) min_level = models.IntegerField(help_text=('The minumum character level ' 'for the adventure')) max_level = models.IntegerField(help_text=('The maximum character level ' diff --git a/server/adventures/tests.py b/server/adventures/tests.py index 7ce503c..da28ae4 100644 --- a/server/adventures/tests.py +++ b/server/adventures/tests.py @@ -1,3 +1,4 @@ from django.test import TestCase +import .models -# Create your tests here. +class ModelTests(TestCase): From 362046c4304627bfd8735d94a8f05b68682f59d8 Mon Sep 17 00:00:00 2001 From: Dylan Evans Date: Fri, 9 Sep 2016 19:57:19 +0100 Subject: [PATCH 04/11] Remove 'description' SyntaxError --- server/adventures/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/server/adventures/models.py b/server/adventures/models.py index 82827a6..0ea8b8e 100644 --- a/server/adventures/models.py +++ b/server/adventures/models.py @@ -34,7 +34,6 @@ class Adventure(models.Model): last_modified = models.DateTimeField(auto_now=True) title = models.TextField() - description edition = models.ForeignKey(Edition) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) From 12266ffcb7fcb809ec0e0a3102077581e64eb9e0 Mon Sep 17 00:00:00 2001 From: Dylan Evans Date: Fri, 9 Sep 2016 20:02:41 +0100 Subject: [PATCH 05/11] Update migrations --- .../migrations/0002_auto_20160909_1901.py | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 server/adventures/migrations/0002_auto_20160909_1901.py diff --git a/server/adventures/migrations/0002_auto_20160909_1901.py b/server/adventures/migrations/0002_auto_20160909_1901.py new file mode 100644 index 0000000..2779923 --- /dev/null +++ b/server/adventures/migrations/0002_auto_20160909_1901.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2016-09-09 19:01 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('adventures', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Setting', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField()), + ], + ), + migrations.AddField( + model_name='adventure', + name='publisher', + field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, to='adventures.Publisher'), + preserve_default=False, + ), + migrations.AlterField( + model_name='adventure', + name='edition', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='adventures.Edition'), + ), + migrations.AddField( + model_name='adventure', + name='setting', + field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, to='adventures.Setting'), + preserve_default=False, + ), + ] From 6541dd476e4d3122c4d79aa1d74fdf05256eab8c Mon Sep 17 00:00:00 2001 From: Dylan Evans Date: Fri, 9 Sep 2016 20:51:56 +0100 Subject: [PATCH 06/11] Add Author model CRUD tests --- server/adventures/tests.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/server/adventures/tests.py b/server/adventures/tests.py index da28ae4..317d8ce 100644 --- a/server/adventures/tests.py +++ b/server/adventures/tests.py @@ -1,4 +1,19 @@ from django.test import TestCase -import .models +from .models import Author, Publisher, Edition, Setting, Adventure -class ModelTests(TestCase): + +class AuthorTests(TestCase): + def setUp(self): + self.gygax = Author.objects.create(name='Gary Gygax') + + def test_create_author(self): + self.assertEqual(Author.objects.first(), self.gygax) + self.assertEqual(Author.objects.count(), 1) + + def test_update_author(self): + Author.objects.filter(id=self.gygax.id).update(name='Joe Bloggs') + self.assertEqual(Author.objects.first().name, 'Joe Bloggs') + + def test_delete_author(self): + Author.objects.filter(id=self.gygax.id).delete() + self.assertEqual(Author.objects.count(), 0) From 94fd4d5bb7d59b9122ce58aa516b0ed3aca04d2c Mon Sep 17 00:00:00 2001 From: Dylan Evans Date: Fri, 9 Sep 2016 21:42:39 +0100 Subject: [PATCH 07/11] Simplify Author model testing The only purpose of testing the models is to make sure that we can use the expected keyword arguments during object creation. For this purpose, full CRUD testing is not necessary. Testing object creation is enough. --- server/adventures/tests.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/server/adventures/tests.py b/server/adventures/tests.py index 317d8ce..266612d 100644 --- a/server/adventures/tests.py +++ b/server/adventures/tests.py @@ -3,17 +3,7 @@ class AuthorTests(TestCase): - def setUp(self): - self.gygax = Author.objects.create(name='Gary Gygax') - def test_create_author(self): - self.assertEqual(Author.objects.first(), self.gygax) + gygax = Author.objects.create(name='Gary Gygax') + self.assertEqual(Author.objects.first(), gygax) self.assertEqual(Author.objects.count(), 1) - - def test_update_author(self): - Author.objects.filter(id=self.gygax.id).update(name='Joe Bloggs') - self.assertEqual(Author.objects.first().name, 'Joe Bloggs') - - def test_delete_author(self): - Author.objects.filter(id=self.gygax.id).delete() - self.assertEqual(Author.objects.count(), 0) From 3fed1e16d6fa2a0d0c4b5a9f2b9ee1892a74fae3 Mon Sep 17 00:00:00 2001 From: Dylan Evans Date: Fri, 9 Sep 2016 21:47:21 +0100 Subject: [PATCH 08/11] Add Publisher model creation test --- server/adventures/tests.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/adventures/tests.py b/server/adventures/tests.py index 266612d..4aa4525 100644 --- a/server/adventures/tests.py +++ b/server/adventures/tests.py @@ -7,3 +7,10 @@ def test_create_author(self): gygax = Author.objects.create(name='Gary Gygax') self.assertEqual(Author.objects.first(), gygax) self.assertEqual(Author.objects.count(), 1) + + +class PublisherTests(TestCase): + def test_create_author(self): + wotc = Publisher.objects.create(name='Wizards of the Coast') + self.assertEqual(Publisher.objects.first(), wotc) + self.assertEqual(Publisher.objects.count(), 1) From 2f863726c246982a5ce6f34219b530a7236abcd9 Mon Sep 17 00:00:00 2001 From: Dylan Evans Date: Fri, 9 Sep 2016 21:49:48 +0100 Subject: [PATCH 09/11] Add Edition model creation test --- server/adventures/tests.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/adventures/tests.py b/server/adventures/tests.py index 4aa4525..fd49b98 100644 --- a/server/adventures/tests.py +++ b/server/adventures/tests.py @@ -14,3 +14,10 @@ def test_create_author(self): wotc = Publisher.objects.create(name='Wizards of the Coast') self.assertEqual(Publisher.objects.first(), wotc) self.assertEqual(Publisher.objects.count(), 1) + + +class EditionTests(TestCase): + def test_create_author(self): + odandd = Edition.objects.create(name='OD&D') + self.assertEqual(Edition.objects.first(), odandd) + self.assertEqual(Edition.objects.count(), 1) From 327ddb6db4009cf329ac0f8fb22b56b002e7ef96 Mon Sep 17 00:00:00 2001 From: Dylan Evans Date: Fri, 9 Sep 2016 21:50:26 +0100 Subject: [PATCH 10/11] Add Setting model creation test --- server/adventures/tests.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/adventures/tests.py b/server/adventures/tests.py index fd49b98..a796fbd 100644 --- a/server/adventures/tests.py +++ b/server/adventures/tests.py @@ -21,3 +21,10 @@ def test_create_author(self): odandd = Edition.objects.create(name='OD&D') self.assertEqual(Edition.objects.first(), odandd) self.assertEqual(Edition.objects.count(), 1) + + +class SettingTests(TestCase): + def test_create_author(self): + fr = Setting.objects.create(name='Forgotten Realms') + self.assertEqual(Setting.objects.first(), fr) + self.assertEqual(Setting.objects.count(), 1) From b06d12fdb4e2afb662ab18c779312f39bfdf7e44 Mon Sep 17 00:00:00 2001 From: Dylan Evans Date: Fri, 9 Sep 2016 23:01:30 +0100 Subject: [PATCH 11/11] Add Adventure model creation test --- server/adventures/tests.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/server/adventures/tests.py b/server/adventures/tests.py index a796fbd..0eb599d 100644 --- a/server/adventures/tests.py +++ b/server/adventures/tests.py @@ -1,3 +1,4 @@ +from datetime import date from django.test import TestCase from .models import Author, Publisher, Edition, Setting, Adventure @@ -28,3 +29,24 @@ def test_create_author(self): fr = Setting.objects.create(name='Forgotten Realms') self.assertEqual(Setting.objects.first(), fr) self.assertEqual(Setting.objects.count(), 1) + + +class AdventureTests(TestCase): + def test_create_author(self): + fifth_ed = Edition.objects.create(name='D&D 5th Edition') + wotc = Publisher.objects.create(name='Wizards of the Coast') + fr = Setting.objects.create(name='Forgotten Realms') + + lmop = Adventure.objects.create( + title='Lost Mines of Phandelver', + edition=fifth_ed, + publisher=wotc, + setting=fr, + published=date(2014, 1, 1), + min_level=1, + max_level=5, + min_characters=3, + max_characters=5) + lmop.authors.create(name='Gary Gygax') + self.assertEqual(Adventure.objects.first(), lmop) + self.assertEqual(Adventure.objects.count(), 1)